通过变量索引号引用节点

Refer to nodes by variable index number

我需要在分层 XML 的文本中构建一个平面 table。每个 meas 节点需要一条扁平线。每个 meas 节点都有一个索引号 (mN),它指回一个较小的部分,其中为索引号的每个唯一可能性保留一个标签 (tL)。我想循环每个 meas 节点并使用 mN 属性的值来查找相应的 tL 值。下面的示例正确提供索引 (mN) 数字,但始终为每一行提供 One

xml

<root>
    <cond tN="1" tL="One"/>
    <cond tN="2" tL="Two"/>
    <cond tN="3" tL="Three"/>
    <cond tN="4" tL="Four"/>
    <cond tN="5" tL="Five"/>
    <meas mN="1"/>
    <meas mN="2"/>
    <meas mN="3"/>
    <meas mN="4"/>
    <meas mN="5"/>
    <meas mN="1"/>
    <meas mN="2"/>
    <meas mN="3"/>
    <meas mN="4"/>
    <meas mN="5"/>
</root>

xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="text"/>
    <xsl:template match="/">
        <xsl:for-each select="/root/meas">
            <xsl:variable name="MeasN">
                <xsl:value-of select="@mN"/>
            </xsl:variable>
            <xsl:value-of select="$MeasN"/>,
            <xsl:value-of select="../cond[$MeasN]/@tL"/>.
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

输出

1 One
2 One
3 One
4 One
5 One
1 One
2 One
3 One
4 One
5 One

您的 MeasN 包含一个字符串,这意味着您的表达式 cond[$MeasN] 将找到您的字符串非空的所有 cond 元素(即所有元素)。但是,xsl:value-of 将只输出第一个。

您可能需要这样做

 <xsl:value-of select="../cond[number($MeasN)]/@tL"/>

或者,您应该改为检查 tN 属性? (无论 cond 元素的顺序如何,这都有效

 <xsl:value-of select="../cond[@tN = $MeasN]/@tL"/>

在检查tL属性的情况下,而不是位置,你也可以用一个键来实现...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="text"/>
    <xsl:key name="cond" match="cond" use="@tN" />
    <xsl:template match="/">
        <xsl:for-each select="/root/meas">
            <xsl:variable name="MeasN" select="@mN"/>
            <xsl:value-of select="$MeasN"/>,
            <xsl:value-of select="key('cond', $MeasN)/@tL"/>.
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>