【问题标题】:Get outer loop counter while iterating nested for-each loop in XSLT 1.0在 XSLT 1.0 中迭代嵌套的 for-each 循环时获取外部循环计数器
【发布时间】:2020-10-05 14:06:57
【问题描述】:

我有一个如下所示的 XML:

<customer>
<fieldgroup>
<field index="1">field1</field>
<field index="2">field1</field>
</fieldgroup>
<fieldgroup>
<field index="1">field3</field>
<field index="2">field4</field>
</fieldgroup>
</customer>

标签在重复,其中的标签也在重复。我正在使用 XST 1.0 将其转换为目标 XML 消息,我将不得不在其中迭代和喜欢:

<xsl for-each select="fieldgroup">
<xsl for-each select="field">
....
</xsl-for-each>
</xsl:for-each>

我将不得不跟踪它正在迭代的项目。在我的第二个 for-each 循环内的代码中,我可以获得循环的循环计数,但是我将如何获得迭代结束的父 for-each 循环的循环计数器?

【问题讨论】:

    标签: xml xslt-1.0


    【解决方案1】:

    只需使用一个变量来存储position() 元素的position()

    <xsl:template match="customer">
      <xsl:for-each select="fieldgroup">
        <xsl:variable name="outerIndex" select="position()" />
        <xsl:for-each select="field">
            <xsl:value-of select="concat('#outer',$outerIndex,'#inner: ',@index,'#&#xa;')" />
        </xsl:for-each>
      </xsl:for-each>
    </xsl:template>
    

    输出是:

    #outer1#inner: 1#
    #outer1#inner: 2#
    #outer2#inner: 1#
    #outer2#inner: 2#
    

    【讨论】:

    • 在 XSLT 中的变量只能初始化一次,这样行吗?会尽力让你知道。
    • 这是正确的。但它确实有效。我猜for循环的每次迭代都被认为是一个带有新“创建”变量的新范围。我在XSLT-1.0 spec 中没有找到任何相关信息。
    • 是的,这是正确的,它正在工作,for 循环的每次迭代中的变量都是新创建的。非常感谢。
    • @Anirban 之所以有效,是因为xsl:for-each 不是“循环”。
    • 这是一个很好的观点。它执行块 for each 节点(并因此创建一个变量 for each 块)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2013-05-09
    • 2016-05-20
    • 2016-05-19
    相关资源
    最近更新 更多