按变量索引号

时间:2015-04-23 11:40:55

标签: xml xslt text

我需要使用分层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

1 个答案:

答案 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>