在//上匹配的XSLT模板

时间:2013-12-27 08:49:51

标签: xslt-2.0

以下xslt代码错误地生成输出。实际上,它应该将值增加1,但是,它会使增量增加2.我需要知道原因。谁能让我知道为什么会这样?

xml输入是

<AAA>
    <BBB>cc </BBB>
    <BBB>ff </BBB>
  <BBB>aa </BBB>
   <BBB>fff </BBB>
   <BBB>FFF </BBB>
  <BBB>Aa </BBB>
  <BBB>ccCCC </BBB>
</AAA>

和xslt输入代码是

<xsl:template match="/">
<xsl:text>
BBB[</xsl:text>
<xsl:value-of select="position()"/>
<xsl:text>]: </xsl:text>
<xsl:value-of select="."/>
</xsl:template>

它产生如下[错误]的输出,但它应该提供诸如[1],[2],[3]等。

BBB[2]: cc 
BBB[4]: ff 
BBB[8]: aa 
BBB[10]: fff 
BBB[12]: FFF 
BBB[14]: Aa 
BBB[16]: ccCCC

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我很确定如果你只有<xsl:template match="/">,那么你甚至不会得到你说的结果。 假设你有

<xsl:template match="BBB">
<xsl:text>
BBB[</xsl:text>
<xsl:value-of select="position()"/>
<xsl:text>]: </xsl:text>
<xsl:value-of select="."/>
</xsl:template>

然后结果取决于其他因素,例如您是否<xsl:strip-space elements="*"/>或是否使用

<xsl:template match="AAA">
  <xsl:apply-templates select="*"/>
</xsl:template>

您当前的结果表明您没有剥离空白文本节点,并且您要么依赖内置模板,要么在匹配<xsl:apply-templates/>的模板中有<xsl:apply-templates select="node()"/>AAA。这样,当前节点列表包含元素节点和文本节点(在元素节点之间),从而产生您的位置结果2,4,6 ......

我会用

修复代码
<xsl:template match="BBB">
<xsl:text>
BBB[</xsl:text>
<xsl:number/>
<xsl:text>]: </xsl:text>
<xsl:value-of select="."/>
</xsl:template>