首页 > 解决方案 > XSLT 在 foreach 循环中通过索引获取节点值

问题描述

我在这里有一个 xml 文件:

<TestBlock number="534" result="ok" text="READDTC_POSTDVT">
            <TestStep datatype="A" result="ok" text="Open Link">
              <StringResult format="ascii" value="BSM" />
            </TestStep>
            <TestStep datatype="A" result="ok" text="BCM DTC Read">
              <StringResult format="ascii" value="REQ" />
            </TestStep>
          </TestBlock>
          <TestBlock number="511" result="ok" text="READDTC_POSTDVT">
            <TestStep datatype="A" result="nok" text="Open Link">
              <StringResult format="ascii" value="CCU" />
            </TestStep>
            <TestStep datatype="A" result="nok" text="BCM DTC Read">
              <StringResult format="ascii" value="REQ" />
            </TestStep>
          </TestBlock>

我期望的结果是
在我只想获得第一个 StringResult@value 的每个 TestBlock 中(例如:BSM、CCU)应该是:

<OP_VAL KEY="BSM" VALUE="okBSM"/>
<OP_VAL KEY="BSM" VALUE="okREQ"/>
<OP_VAL KEY="CCU" VALUE="nokCCU"/>
<OP_VAL KEY="CCU" VALUE="nokREQ"/>

我的 xslt 但它不起作用:

<xsl:for-each select="/Telegram/Body/Data/ResultData/TestResult/TestBlock">
    <xsl:for-each select="TestStep">
        <xsl:element name="OP_VAL">
            <xsl:attribute name="KEY">
                <xsl:value-of select="/Telegram/Body/Data/ResultData/TestResult/TestBlock[1]/StringResult/@value"/>
            </xsl:attribute>
        </xsl:attribute>
        <xsl:attribute name="VALUE">
                    <xsl:value-of select="concat(@result,StringResult/@value)"/>
        </xsl:attribute>
    </xsl:element>
</xsl:for-each>
</xsl:for-each>

标签: xmlxslt

解决方案


任何for-each更改上下文节点,您可能想要选择../TestBlock[1]/StringResult/@value而不是/Telegram/Body/Data/ResultData/TestResult/TestBlock[1]/StringResult/@value.

另请注意,xsl:element仅需要在运行时计算元素名称或命名空间,否则使用文字结果元素,例如<OP_VAL KEY="{../TestBlock[1]/StringResult/@value}" VALUE="{@result}{StringResult/@value}"/>


推荐阅读