我是xslt 2.0的新手,我只想在for-each循环中将值设置为一个变量一次(意味着如果设置了值,我想退出循环)。
目前,它为所有用户保持迭代。我只想在值设置好之后立即退出循环(紧接在我第一次尝试之后)。如果值设置一次,我不确定如何中断。
您能帮我解决下面的代码吗?
XSLT代码:
<xsl:variable name="v_first_name">
<xsl:for-each select="$emailList/emails/child::*">
<xsl:variable name="mailid" select="id" />
<xsl:for-each select="$userList/users/child::*">
<xsl:if test="emailid = $mailid">
<xsl:if test="firstname eq 'Antony'">
<xsl:value-of select="firstname" />
</xsl:if>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</xsl:variable>
<xsl:if test="$v_first_name != ''">
<first_name>
<xsl:value-of select="$v_first_name" />
</first_name>
</xsl:if>
XML O / p:
<first_name>AntonyAntonyAntonyAntony</first_name>
预期的XML O / P:
<first_name>Antony</first_name>
注1:请注意,我使用的是xslt 2.0,并且列表中可以有重复项(因此Antony可以出现两次,但是我只想出现一次(或唯一))。注意2:我也尝试了position(),但由于条件()可以在任何位置匹配,所以找不到它。
提前感谢。
从XPath开始,只需选择要查找的节点,而不是将for-each
视为“循环”。如果您选择$userList/users/*[emailid = $emailList/emails/*/id]
从users
中选择在emailid
中具有匹配的$emailList/emails/*
的子元素。
我不确定将硬编码一个名字值然后输出它具有什么意义,但是您当然可以选择例如$userList/users/*[emailid = $emailList/emails/*/id and firstname = 'Antony']/lastname
。如果您要首先使用位置谓词,则可以给您一系列元素节点。取决于输入$userList/users/*[emailid = $emailList/emails/*/id and firstname = 'Antony'][1]/lastname
或所有选定元素($userList/users/*[emailid = $emailList/emails/*/id and firstname = 'Antony']/lastname)[1]
的结构。