Xslt XPath表达式来选择不是某个特定元素的所有子元素

Xslt XPath表达式来选择不是某个特定元素的所有子元素,xslt,xpath,Xslt,Xpath,给定XML <blockquote> <attribution>foo</attribution> <para>bar</para> </blockquote> 福 酒吧 我有XSL模板 <xsl:template match="dbk:blockquote"> <blockquote> <xsl:apply-templates select="*[

给定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>

其中,第一个
应用模板
应选择
dbk:blockquote
的所有子元素,这些子元素不属于类型
dbk:attribute
。(这是将属性移动到底部所必需的。)


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

我不是xpath专家。但我认为这应该行得通

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

我不是xpath专家。但我认为这应该行得通

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

要使用
self
轴:

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


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

是否要使用
self
轴:

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


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

真奇怪。真的没有捷径吗?我想说这是
not()
最简单的例子,但例子涵盖了更复杂的东西,比如
author[degree and not(publication)]
,比这要短。另外,当我添加名称空间时(即
attribute
变成
dbk:attribute
),第一个匹配
attribute
元素,第二个匹配
para
元素!真奇怪,真奇怪。真的没有捷径吗?我想说这是
not()
最简单的例子,但例子涵盖了更复杂的东西,比如
author[degree and not(publication)]
,比这要短。另外,当我添加名称空间时(即
attribute
变成
dbk:attribute
),第一个匹配
attribute
元素,第二个匹配
para
元素!真奇怪,啊哈!谢谢,行得通。(我的理由也没有道理。)啊哈!谢谢,行得通。(我的理由也没有道理。)“类型”在XML模式/XPath世界中有一个特定的含义…“类型”在XML模式/XPath世界中有一个特定的含义。。。