我有一个带有顶级元素的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>
它正常工作。所以我用直接引用替换了一个变量。我无法弄清楚为什么会产生影响。什么可能导致这个?
答案 0 :(得分:1)
无效和工作案例实际上非常不同:
无法正常工作:在preceding-sibling::*[$layout = 'one']
中,$layout
的{{1}}值始终与one
中最初设置的值相同声明。
工作:在<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')]