我在样式表中的attribut上进行了全局匹配,但我想排除f元素。我怎么能这样做?
示例XML:
<a>
<b formatter="std">...</b>
<c formatter="abc">...</c>
<d formatter="xxx">
<e formatter="uuu">...</e>
<f formatter="iii">
<g formatter="ooo">...</g>
<h formatter="uuu">...</h>
</f>
</d>
</a>
目前的解决方案:
<xsl:template match="//*[@formatter]">
...
</xsl:template>
我尝试过类似的东西,但这没效果。
<xsl:template match="f//*[@formatter]">
...
</xsl:template>
<xsl:template match="//f*[@formatter]">
...
</xsl:template>
答案 0 :(得分:3)
//f[@formatter]
或f[@formatter]
都可以使用(//
不是必需的)。在您的示例输入上运行此XSLT时:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="*[@formatter]">
<xsl:element name="transformed-{local-name()}">
<xsl:apply-templates select="@* | node()" />
</xsl:element>
</xsl:template>
<xsl:template match="f[@formatter]">
<xsl:apply-templates select="node()" />
</xsl:template>
</xsl:stylesheet>
结果是:
<a>
<transformed-b formatter="std">...</transformed-b>
<transformed-c formatter="abc">...</transformed-c>
<transformed-d formatter="xxx">
<transformed-e formatter="uuu">...</transformed-e>
<transformed-g formatter="ooo">...</transformed-g>
<transformed-h formatter="uuu">...</transformed-h>
</transformed-d>
</a>
如您所见,f
被排除在外。这是回答你的问题,还是我误解了你想做什么?