在条件基础上为每个循环中断



我是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]的结构。

最新更新