XPath表达式,用于选择不是某些特定元素的所有子元素

时间:2011-04-19 20:06:57

标签: xslt xpath

鉴于XML

<blockquote>
    <attribution>foo</attribution>
    <para>bar</para>
</blockquote>

我有XSL模板

<xsl:template match="dbk:blockquote">
    <blockquote>
        <xsl:apply-templates select="*[not(dbk:attribution)]" />
        <xsl:apply-templates select="dbk:attribution" />
    </blockquote>
</xsl:template>

其中第一个apply-templates应选择dbk:blockquote中不属于dbk:attribution类型的所有子元素。 (这是将归因移到底部的必要条件。)

但是,它实际上匹配每个节点。为什么呢?

2 个答案:

答案 0 :(得分:7)

您想使用self轴:

<xsl:apply-templates select="*[not(self::dbk:attribution)]" />

这将选择不是自身的子元素 dbk:attribution元素。您的版本选择不包含 dbk:attribution子项的子元素。

答案 1 :(得分:0)

我不是xpath专家。但我认为这应该有用。

<xsl:template match="dbk:blockquote">
    <blockquote>
        <xsl:apply-templates select="*[local-name(.) != 'attribution']" />
        <xsl:apply-templates select="*[local-name(.) = 'attribution']" />
    </blockquote>
</xsl:template>