我有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 ??
答案 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中处理数组感到失望。