我是xslt 2.0的新手,我想为每个循环中的一个变量只设置一次值(意味着如果设置了值,我想退出循环(。
目前,它一直在为所有用户进行迭代。我只想在值设置后(在我第一次尝试后立即(退出循环。如果值设置了一次,我不知道如何打破。
你能帮我处理下面的代码吗?
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
中选择在$emailList/emails/*
中具有匹配emailid
的子元素。
我不确定硬编码名字值然后输出它有什么意义,但当然你可以选择例如$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]
的结构。