Xslt XPath表达式来选择不是某个特定元素的所有子元素
给定XMLXslt 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="*[
<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世界中有一个特定的含义。。。