Xslt 为什么在模板模式中不允许使用后代或self::?
假设我有以下XML(将注释方案嵌入到HTML中):Xslt 为什么在模板模式中不允许使用后代或self::?,xslt,Xslt,假设我有以下XML(将注释方案嵌入到HTML中): (例如,参见Greger IH等人2007年《神经科学趋势》30(8):407-16)。 现在,我想将所有注释节点原样复制到生成的XHTML中,但只将重命名为(因为只允许在中使用),因此我使用了以下转换: <xsl:template match="tei:bibl/descendant-or-self::*"> <xsl:variable name="nodeName"> <xsl:choo
(例如,参见Greger IH等人2007年《神经科学趋势》30(8):407-16)。
现在,我想将所有注释节点原样复制到生成的XHTML中,但只将
重命名为
(因为
只允许在
中使用),因此我使用了以下转换:
<xsl:template match="tei:bibl/descendant-or-self::*">
<xsl:variable name="nodeName">
<xsl:choose>
<xsl:when test="name() = 'title'">bibTitle</xsl:when>
<xsl:otherwise><xsl:value-of select="name()" /></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- Changing of the namespace occurs here, but we don't care -->
<xsl:element name="{$nodeName}">
<xsl:copy-of select="@*" />
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="p/text()|tei:bibl//text()">
<xsl:copy-of select="." />
</xsl:template>
比比特尔
但是,它不会编译并中断,出现以下错误:
匹配模式中只允许使用child::和attribute::轴!有问题的轴=后代或自身
当我将匹配规则更改为
时,它将按预期工作。但这应该与后代或自我相同:*
,对吗?我是否达到了transformer实现的限制
首先,我用Mozilla 3.5 internal transformer进行了测试,然后用Xalan 2.7.1进行了测试——同样的负面结果。这是一个很难满足的要求,因为:
尽管模式不能使用子轴或自轴,但模式可以使用//运算符和/运算符
这是一项很难满足的要求:
尽管模式不能使用子轴或自轴,但模式可以使用//运算符和/运算符
此限制仅对模板匹配模式中的任何位置步骤有效。它是通过设计(W3C和规范强制要求)来确保有效的XSLT处理的
注意:可以在任何位置步骤后面的谓词中自由使用任何轴(包括降序或self::
)
更新:
<nums>
<num>1</num>
<num>2</num>
<num>3</num>
<num>4</num>
<num>5</num>
<num>6</num>
<num>7</num>
<num>8</num>
<num>9</num>
<num>10</num>
</nums>
下面是在xsl:template
的match
属性中使用后代或self::
轴的一个简短完整的示例:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="num[descendant-or-self::num > 5]"/>
</xsl:stylesheet>
此限制仅对模板匹配模式中的任何位置步骤有效。它是通过设计(W3C和规范强制要求)来确保有效的XSLT处理的
注意:可以在任何位置步骤后面的谓词中自由使用任何轴(包括降序或self::
)
更新:
<nums>
<num>1</num>
<num>2</num>
<num>3</num>
<num>4</num>
<num>5</num>
<num>6</num>
<num>7</num>
<num>8</num>
<num>9</num>
<num>10</num>
</nums>
下面是在xsl:template
的match
属性中使用后代或self::
轴的一个简短完整的示例:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="num[descendant-or-self::num > 5]"/>
</xsl:stylesheet>
这里有一种方法可以将模式重写为等效模式,而不会重复提到tei:bibl
:
<xsl:template match="*[ancestor-or-self::tei:bibl]">
至于为什么会存在限制,一般的答案是,是的,是关于性能。也许这些限制过于保守,因为正如您所指出的,在这种情况下,重写后代或自我是微不足道的
我经常对这个限制感到恼火(你可以使用//但不能使用后代)。这里有一种方法,你可以将模式重写成一个等价的模式,而不重复提到tei:bibl
:
<xsl:template match="*[ancestor-or-self::tei:bibl]">
至于为什么会存在限制,一般的答案是,是的,是关于性能。也许这些限制过于保守,因为正如您所指出的,在这种情况下,重写后代或自我是微不足道的
我经常对这个限制感到恼火(您可以使用//但不能使用后代)。这里是一个不够的例子:
<a>
<b>
<c>
<c>
<c/>
</c>
</c>
</b>
<c>
<c>
<c/>
</c>
</c>
</a>
i、 例如,如果谓词p(.)在a上为真,我想要a/c、a/c/c、a/c/c,如果在b上为真,我想要b/c、b/c/c和b/c/c
但是我不想要a/b/c、a/b/c/c等等,因为谓词匹配a而不是b
如果我制作匹配模式:
*[self::a or self::b][p(.)]//c
然后我匹配所有我不想要的
因此,我必须在括号中向后做:
c[ancestor-or-self::c/parent::*[self::a or self::b][p(.)]]
我想我只是说服自己,这个限制并不是一个真正的逻辑限制,但是,我认为不允许在匹配模式中使用正确的轴步长的借口是非常站不住脚的,因为当我需要这个时,我需要这个,谁在乎它是否比我使用更简单的表达式快。这里是一个不够的例子:
<a>
<b>
<c>
<c>
<c/>
</c>
</c>
</b>
<c>
<c>
<c/>
</c>
</c>
</a>
i、 例如,如果谓词p(.)在a上为真,我想要a/c、a/c/c、a/c/c,如果在b上为真,我想要b/c、b/c/c和b/c/c
但是我不想要a/b/c、a/b/c/c等等,因为谓词匹配a而不是b
如果我制作匹配模式:
*[self::a or self::b][p(.)]//c
然后我匹配所有我不想要的
因此,我必须在括号中向后做:
c[ancestor-or-self::c/parent::*[self::a or self::b][p(.)]]
我想我只是说服自己,这个限制并不是一个真正的逻辑限制,但是,我认为不允许在匹配模式中使用正确的轴步的借口是非常站不住脚的,因为当我需要这个时,我需要这个,谁在乎它是否比我使用更简单的表达式快。你能给出你的想法吗,这种限制究竟是如何影响性能的(通过重新编写规则,使变压器必须执行相同的工作)?你能不能提供一个例子,说明在任何位置步骤之后的谓词是什么(让我知道这把斧子的正确用法是什么)?谢谢。@dma_k:如果您提供了一个特定的转换问题(一个XML文档、期望的结果、规则),那么我很乐意向您展示如何使用允许的语法指定模板。您能给出您的想法吗?这个限制到底是如何影响性能的(通过重新编写规则来等效,转换器无论如何都必须执行相同的工作)?您能否提供遵循任何位置步骤的谓词示例(让我知道此axe的正确用法)?谢谢。@dma_k:如果您提供了特定的转换问题(XML文档、所需结果、规则)然后我将很高兴向您展示如何使用允许的语法指定模板