两个阶段处理:从阶段1 XSLT 2.0处理不输出空标签两个阶段处理:从阶段1 XSLT 2.0处理

2019-05-12 02:54发布

我有一些复杂的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
标签: xslt xslt-2.0