我需要使用分层XML在文本中构建一个平面表。我需要每个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
答案 0 :(得分:1)
您的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>