我无法获得有关XSL匹配规则的内容。
我有这样的意见:
<root>
<metadata>
</metadata>
<elements>
<a-elems>
<a>A1</a>
<a>A2</a>
</a-elems>
<b-elems>
<b>B1</b>
<b>B2</b>
</b-elems>
</elements>
</root>
此XSL按我的意愿工作,报告<a>
值列表:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:template match = "/">
_____ Elements _____
<xsl:apply-templates select = "root/elements/*/*" />
</xsl:template>
<xsl:template match = "a-elems/a">
__ A ELEM: <xsl:value-of select = "."></xsl:value-of> __
</xsl:template>
<xsl:template match="*">
<xsl:message>Excluding <xsl:value-of select = "name(.)" /></xsl:message>
</xsl:template>
</xsl:stylesheet>
但是,我认为这个根模板,我说明我想要开始的级别,会更清晰:
<xsl:template match = "/root/elements">
_____ Elements _____
<xsl:apply-templates select = "*/*" />
</xsl:template>
但它不起作用,我得到'排除根'消息,我理解模板从不匹配。我不明白为什么,我也试过select =“*”并添加优先级属性。
答案 0 :(得分:1)
XSLT将首先查找匹配/
(文档节点)的模板。通过将匹配/
的模板更改为/root/elements
,将导致XSLT使用built-in template rule来匹配/
。这个内置模板实际上是这样的:
<xsl:template match = "/">
<xsl:apply-templates />
</xsl:template>
xsl:apply-templates
将选择子root
节点。然后,这将与匹配*
的模板匹配,以便您收到消息,并且不再执行任何处理。
最简单的解决方案是回到你拥有的东西。
编辑:在回答您的评论时,您并不总是需要重新定义/
。原始解决方案的另一个细微变化就是这样做......
<xsl:template match = "root">
_____ Elements _____
<xsl:apply-templates select = "elements/*/*" />
</xsl:template>