我有一些复杂的XSLT 2.0转换。 我试图找出是否有通用的方法,以确保没有空的标签输出。 所以......从概念上讲,处理的最后阶段是递归删除所有空标签。 我理解,这可以通过一个单独的XSLT是什么也没做,但过滤掉空标签来完成,但我需要把它所有一起打包在一个单一的一个。
Answer 1:
此XSLT 2.0变换示出了如何多遍(在这个例子2通)处理可以做到 :
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*" mode="#all">
<xsl:copy>
<xsl:apply-templates select="node()|@*" mode="#current"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:variable name="vPass1">
<xsl:apply-templates/>
</xsl:variable>
<xsl:apply-templates select="$vPass1/*" mode="non-empty"/>
</xsl:template>
<xsl:template match="text()[xs:integer(.) mod 2 eq 0]"/>
<xsl:template match="*[not(node())]" mode="non-empty"/>
</xsl:stylesheet>
当应用这个XML文档上 :
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
它创建在第一遍结果文件(在所捕获的$vPass1
变量),其中所有的<num>
与内容元素的偶数整数剥去它们的内容和为空。 然后,在第二遍中,在特定的模式中应用,所有空元素被删除。
转换的结果是 :
<nums>
<num>01</num>
<num>03</num>
<num>05</num>
<num>07</num>
<num>09</num>
</nums>
请注意,使用模式和特殊模式#all
和#current
。
更新:OP现在想在评论删除“递归”“那有没有非空后裔所有节点”。
这可以通过使用没有明确的递归实现简单。 只是改变:
<xsl:template match="*[not(node())]" mode="non-empty"/>
至:
<xsl:template match="*[not(descendant::text())]" mode="non-empty"/>
文章来源: Two phase processing: Do not output empty tags from phase-1 XSLT 2.0 processing