有没有办法阻止使用xslt显示不匹配的xml标签?

时间:2010-05-10 21:46:05

标签: xslt

这是一个xml文档的人为例子。在我的真实案例中,xml相当复杂,有多个嵌套级别。

<alphabet>
<a>A</a>
<b>B</b>
<c>C</c> 
... and so on
</alphabet>

使用xslt,我想转换文档,以便只打印元音。

在我的真实案例中,我们使用空模板匹配标记来阻止显示。但这对我来说太冗长了。

2 个答案:

答案 0 :(得分:1)

我不允许“默认”或最低优先级/优先级匹配模板以静默方式吞下元音或执行任何其他有意义的应用程序处理

这是一个很好的做法,所有其他不匹配的节点(给定类型)的模板应该产生一个好的调试消息,并且可选地终止处理。

如果不遵循这种推荐的做法,那么很多人会忽略这些错误,并且很难在任何给定的固定时间内找到它们并进行修复。

这是一个解决方案,它只会占用一个空模板

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my"
 >
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <my:vowels>
   <c>A</c>
   <c>E</c>
   <c>I</c>
   <c>O</c>
   <c>U</c>
 </my:vowels>

 <xsl:template match="node()|@*">
   <xsl:copy>
    <xsl:apply-templates select="node()|@*"/>
   </xsl:copy>
 </xsl:template>

 <xsl:template match="c[not(. = document('')/*/my:vowels/*)]"/>
</xsl:stylesheet>

对以下XML文档执行此转换时

<alphabet>
    <c>A</c>
    <c>B</c>
    <c>C</c>
    <c>D</c>
    <c>E</c>
    <c>F</c>
    <c>G</c>
    <c>H</c>
    <c>I</c>
    <c>J</c>
    <c>K</c>
    <c>L</c>
    <c>M</c>
    <c>N</c>
    <c>O</c>
    <c>P</c>
    <c>Q</c>
    <c>R</c>
    <c>S</c>
    <c>T</c>
    <c>U</c>
    <c>V</c>
    <c>W</c>
    <c>X</c>
    <c>Y</c>
    <c>Z</c>
</alphabet>

生成了想要的结果

<alphabet>
    <c>A</c>
    <c>E</c>
    <c>I</c>
    <c>O</c>
    <c>U</c>
</alphabet>

答案 1 :(得分:0)

XSLT有precedence rules for templates with conflicting matches(链接到XSLT规范)。因此,您可以拥有一个*模板,默认情况下“吞下”标签,并添加显示或处理音乐的显式模板。