XSLT通过id获取数组元素

时间:2014-07-11 13:17:25

标签: arrays xslt

我有XSLT:

<xsl:template match="/">
    <!--<FLC_OKVEDCODE>-->
    <xsl:variable name="valArray" select="//NodeA | //NodeB | //NodeC"/>
    <xsl:variable name="valResArray">
        <result_value>TextA</result_value>
        <result_value>TextB</result_value>
        <result_value>TextC</result_value>
    </xsl:variable>
    <xsl:variable name="resArray" select="document('')//xsl:variable[@name= 'valResArray']/*"></xsl:variable>

    <xsl:for-each select="$valArray">
        <xsl:if test="string-length(normalize-space(text())) = 0">
            <ERROR>
                <Err1><xsl:value-of select="position()"></xsl:value-of></Err1>
                <Err2><xsl:value-of select="$resArray[1]"></xsl:value-of></Err2>
                <Err3><xsl:value-of select="$resArray[2]"></xsl:value-of></Err3>
                <Err4><xsl:value-of select="$resArray[3]"></xsl:value-of></Err4>
                <Err5><xsl:value-of select="$resArray[position()]"></xsl:value-of></Err5>
            </ERROR>
        </xsl:if>
    </xsl:for-each>
    <!--</FLC_>-->
</xsl:template>

必须检查NodeA,NodeB和NodeC是否为空 - 创建错误XML。在我的测试中NodeB是空的,但结果是:

<ERROR>
    <Err1>2</Err1>
    <Err2>TextA</Err2>
    <Err3>TextB</Err3>
    <Err4>TextC</Err4>
    <Err5>TextA</Err5>
</ERROR>

为什么Err5是TextA,如果position()返回2而$ resArray [2](打印在)是TextB ??

2 个答案:

答案 0 :(得分:2)

  

为什么Err5是TextA,如果position()返回2

为什么你认为position()返回2?事实是表达式:

$resArray[position()]

表示“ $ resArray的所有节点都具有非零(即真实)位置”。 $ resArray的所有节点都是如此。

因此表达式:

<xsl:value-of select="$resArray[position()]"/>

将返回XSLT 1.0中返回的节点集(即TextA)的 first 节点的值,以及所有匹配节点的值(即TextA TextB TextC )在XSLT 2.0中。

答案 1 :(得分:1)

在我的大脑出现问题后,解决方案非常简单:

添加:

<xsl:variable name="temppos" select="position()"></xsl:variable>
在Err4和Err5之间

。看起来它会自动将数组作为&#34; position&#34;等函数的参数,并用最接近的数组来完成。所以,&#34;位置()&#34; &#34; resArray&#34;仍然是1,这就是为什么有这个结果。

这是我猜的解释。我仍然对在XSLT中处理数组感到失望。