我是XSLT的新手,如果有关循环的其他问题的解决方案可以解决我的问题,我很抱歉,但到目前为止我没有运气。
我有一个包含多个节点的XML文件,如下所示:
<Roles>
<Role>User</Role>
<Purpose>General User</Purpose>
<Role>Staff</Role>
<Purpose>Company Staff</Purpose>
<Role>Admin</Role>
<Purpose>Administration</Purpose>
</Roles>
我需要遍历这些节点并打印&lt; Role&gt;以及它的匹配&lt;目的&gt;。但是,如果我使用for-each循环,它将遍历&lt; Role&gt;罚款,但打印相同的&lt;目的&gt;对于每个(只是第一个角色/目的元素。
有没有什么方法可以将它们同步起来,例如,当for-each循环处于第二次迭代时,它会选择第二个&lt;目的&gt;以及第二个&lt; Role&gt;所以它最终会是这样的?
User - General User
Staff - Company Staff
Admin - Administration
我一直在考虑使用如下所示的params,但是在编译时我得到“在该上下文中不允许使用元素-param”错误(可能是我缺乏使用它的XSLT理解错误)。
<xsl:param name="i" select="1"/>
我必须保持元素分开(即我不能只是做&lt;角色&gt;用户 - 一般用户&lt; / Role&gt;由于恼人的格式化原因,但是如果有人可以想到一个替代的循环也可以工作我我会很感激的。
答案 0 :(得分:1)
您可以使用following-sibling::
axis执行此操作。您需要选择以下第一个Purpose
兄弟。
使用xsl:for-each
已有答案,所以这里使用xsl:apply-templates
...
XML输入
<Roles>
<Role>User</Role>
<Purpose>General User</Purpose>
<Role>Staff</Role>
<Purpose>Company Staff</Purpose>
<Role>Admin</Role>
<Purpose>Administration</Purpose>
</Roles>
XSLT 1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="Roles">
<xsl:copy>
<xsl:apply-templates select="Role"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Role">
<xsl:copy>
<xsl:value-of select="concat(., ' - ', following-sibling::Purpose[1])"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
输出(不确定这是否是您想要的输出,因为您没有指定,但它至少显示了这个概念)
<Roles>
<Role>User - General User</Role>
<Role>Staff - Company Staff</Role>
<Role>Admin - Administration</Role>
</Roles>
答案 1 :(得分:0)
使用following-sibling
。类似的东西:
<xsl:for-each select="Role">
<xsl:value-of select="."/>
<xsl:text> - </xsl:text>
<xsl:value-of select="following-sibling::Purpose[1]"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
仅适用于XSLT 1.0(请参阅评论Daniel Haley)。