通过变量索引号引用节点
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>
我需要在分层 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>