我的XSL中有两个模板,它们都应用于同一节点,但一个比另一个更具体
e.g。对于这个xml
<root>
<a/>
<a attr="1" attr2="2"/>
</root>
和这个xsl:
<xsl:template match="a">
base template
</xsl:template>
<xsl:template match="a[@attr]">
specific
</xsl:template>
通常,XSL将仅应用其中一个模板。 但是,在我更具体的模板中,我还想应用不太具体的模板中的所有内容。
答案 0 :(得分:3)
XSLT 2.0为此目的具有<xsl:next-match/>
instruction,但在1.0中,唯一的通用选项是将特定于较少的模板放在单独的XSLT文件中<xsl:import>
,然后使用{{1} }。如果您确切地知道哪个&#34;不太具体的模板&#34;您想要使用的替代方法是为该模板提供<xsl:apply-imports/>
以及name
,然后使用match
调用它,但绕过匹配机制 - 您必须决定使用哪个模板你是压倒性的,而不是让发动机找到&#34;次佳的&#34;。
答案 1 :(得分:0)
“继承”在XSLT中没有明确的含义。继承是一种面向对象的概念,适用于类和对象 - 在功能范例中不存在。
没有xsl:apply-templates
属性的select
不会应用与当前节点相同的其他模板。
相反,它指示XSLT处理器处理剩余的输入节点,并为处理器选择适当的模板。换句话说,这不会导致同一节点被处理两次。
现在,请考虑以下样式表(基本上是您的解决方案):
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:strip-space elements="*"/>
<xsl:template match="a">
base template
</xsl:template>
<xsl:template match="a[@attr]">
<xsl:apply-templates/>
specific
</xsl:template>
</xsl:stylesheet>
在模板匹配a[@attr]
的上下文中,<xsl:apply-templates/>
表示:
处理当前节点的所有可用子节点(所有元素
*
,processing-instruction(),comment(),所有属性@ *,text())。
在您的输入XML中,只有一个a
节点与此模板匹配。它只有属性节点,默认情况下不输出。
通常,XSL将仅应用其中一个模板。但是,在我更具体的模板中,我还想应用不太具体的模板中的所有内容。
有几种解决方案(例如,在命名模板中存储可重用内容并调用它,导入外部样式表,使用变量,使用模板优先级,使用xsl:choose
)。但首先你必须透露what exactly you'd like to achieve。
答案 2 :(得分:-3)
这个答案不正确
使用
<xsl:apply-templates/>
没有select
属性的应用与当前节点匹配的其他模板
这个XSL:
<xsl:template match="a">
base template
</xsl:template>
<xsl:template match="a[@attr]">
<xsl:apply-templates/>
specific
</xsl:template>
产生以下输出:
base template
specific
如果有超过1个特定模板的链条如上所述,我还没有调查可能会发生什么。