2

我有一个包含顶级元素的 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>

它工作正常。所以我用直接引用替换了一个变量。我不明白为什么这会有所作为。什么可能导致这种情况?

4

2 回答 2

1

不工作工作的情况实际上是非常不同的:

  1. 不工作: In preceding-sibling::*[$layout = 'one'], $layout 总是与one最初在<xsl:variable name="layout" select="@template"/>语句中设置时的值相同。

  2. 工作:在preceding-sibling::*[@template = 'one']中, @template根据@template不同的前兄弟上下文节点的属性值而变化。

于 2013-10-02T14:04:25.870 回答
0
*[(@template = 'one')]

上面的意思是:计算所有nodes属性template等于文本的地方one

*[($layout = 'one')]

上面的意思是:计算所有nodes变量layout等于文本的地方one。我认为你提出的问题$layout不是用文字填充的one,而是用xsl:call-template. 也许这里出了点问题?

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

chapter[($layout = 'one')]
chapter[(@template = 'one')]
于 2013-10-02T13:29:34.470 回答