2014-07-11 69 views
1

得到数组元素我有XSLT:XSLT通过ID

<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。在我的测试节点B是空的,但结果是:

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

为什么Err5是TEXTA,如果位置()的返回2和$ resArray [2](在印刷)是TEXTB ??

回答

1

之后问题吃了我的大脑,解决方案很简单:

添加:

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

。它看起来像它会自动将数组作为“位置”等函数的参数,并使用最接近的数组进行操作。所以,“resArray”的“position()”仍然是1,这就是为什么会有这个结果。

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

+1

问题是谓词改变了上下文 - $ resarray [position()]在'$ resarray'中的每个节点的上下文中评估'position()'谓词一次,而你想要做的是捕获_outer_上下文中的'position()'值('for-each')并在谓词中使用该值。正如你发现的,最简单的方法是使用一个变量。 –

+2

数值谓词'[N]'等同于[[position()= N]',所以'[position()]'意味着[[position()= position()]'总是为真。 –

2

为什么Err5是TEXTA,如果位置()返回2

为什么你认为那个位置()返回2?事实是,表达式:

$resArray[position()] 

指“具有非零(即真实)位置 $ resArray的所有节点”。这是所有 $ resArray的节点。

因此表达式:

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

将返回的第一节点的值返回的节点集(即TextA)在XSLT 1.0,并且所有匹配的节点的值(即TextA TextB TextC)在XSLT 2.0中。

+0

因为上面3行的“position()”返回2.我需要可迭代数组的位置,但不知道如何解决它,在哪里读取它等。 – Arkady

+0

@Arkady这不是它的工作原理。谓词中的position()是被测节点的位置。例如,如果您尝试'$ resArray [position()= 2]',则可以看到此内容。 –