XSLT for-each循环迭代2个元素

时间:2016-10-05 23:09:20

标签: xml xslt

我是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;由于恼人的格式化原因,但是如果有人可以想到一个替代的循环也可以工作我我会很感激的。

2 个答案:

答案 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>&#xa;</xsl:text>
</xsl:for-each>

仅适用于XSLT 1.0(请参阅评论Daniel Haley)。