节点集测试不一致?

时间:2013-10-02 12:55:39

标签: xslt xpath

我有一个带有顶级元素的XML:

<chapter template="one"/>
<chapter template="two"/>
<chapter template="one"/>
<chapter template="one"/>
<chapter template="two"/>
<chapter template="one"/>

我正在使用select语句循环遍历这些元素:

<xsl:variable name="layout" select="@template"/>
<xsl:choose>
    <xsl:when test="contains($layout, 'one')">
        <xsl:call-template name="processChapterOne"/>
    </xsl:when>
    <xsl:when test="contains($layout, 'two')">
        <xsl:call-template name="processChaptertwo"/>
    </xsl:when>
<xsl:otherwise/>
</xsl:choose>

这可以正常工作。但现在我正在尝试进行一些条件处理,所以我试图找到列表中的第一章:

<xsl:when test="count(preceding-sibling::*[($layout = 'one')]) = '0'">
    <xsl:call-template name="processChapterOne"/>
</xsl:when>

这是事情变得怪异的时候。我的测试永远不会成为现实:count(...)的值对于列表的第一章是4,并从那里开始递增。看起来它会计算所有顶级元素,而不仅仅是名为“章节”的元素。 当我将代码更改为:

<xsl:when test="count(preceding-sibling::*[(@template = 'one')]) = '0'">
    <xsl:call-template name="processChapterOne"/>
</xsl:when>

它正常工作。所以我用直接引用替换了一个变量。我无法弄清楚为什么会产生影响。什么可能导致这个?

2 个答案:

答案 0 :(得分:1)

无效工作案例实际上非常不同:

  1. 无法正常工作:在preceding-sibling::*[$layout = 'one']中,$layout的{​​{1}}值始终与one中最初设置的值相同声明。

  2. 工作:在<xsl:variable name="layout" select="@template"/>中,preceding-sibling::*[@template = 'one']根据不同的先前兄弟情境节点的@template属性值而有所不同。

答案 1 :(得分:0)

*[(@template = 'one')]

以上意思是:计算属性nodes等于文字template的所有one

*[($layout = 'one')]

以上意思是:计算变量nodes等于文本layout的所有one。 我认为,您提出的问题$layout未填充文字one,但它会执行xsl:call-template。也许这里出了什么问题?

除此之外,如果您不想计算所有nodes,只计算chapter个节点。这样做:

chapter[($layout = 'one')]
chapter[(@template = 'one')]