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

Posted

技术标签:

【中文标题】两阶段处理:不要从阶段 1 XSLT 2.0 处理中输出空标签【英文标题】:Two phase processing: Do not output empty tags from phase-1 XSLT 2.0 processing 【发布时间】:2011-03-13 02:09:24 【问题描述】:

我有一些复杂的 XSLT 2.0 转换。我试图找出是否有通用方法来确保不输出空标签。所以......从概念上讲,递归删除所有空标签的最后一个处理阶段。我知道这可以通过一个单独的 XSLT 来完成,它除了过滤掉空标签之外什么都不做,但我需要将它们全部打包在一个单独的 XSLT 中。

【问题讨论】:

很好的问题 (+1)。请参阅我的答案以获得详细的解决方案。 【参考方案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 变量中捕获),其中所有具有甚至整数内容的&lt;num&gt; 元素都被剥离其内容并为空。然后,在以特定模式应用的第二遍中,删除所有空元素。

变换的结果是

<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"/>

【讨论】:

这回答了整个问题,但是它遗漏了一个特定部分-递归删除所有空标签...所以我只需要更改“* [not(node())]”到一个适当的表达式,表示所有没有非空后代的节点。 @taotree 下次更好地陈述你的问题。 :) 我认为最好将这个新要求作为一个单独的问题——这也是一个很好的问题。您可以将其用于空模板的匹配模式:*[not(descendant::text())] @taotree 更新了答案以反映您的新要求... :)

以上是关于两阶段处理:不要从阶段 1 XSLT 2.0 处理中输出空标签的主要内容,如果未能解决你的问题,请参考以下文章

TCC和两阶段分布式事务处理的区别

两阶段提交协议的异常处理

XSLT 使用 xslt 2.0 或更高版本将纯文本文件处理为 XML

XSLT XML 到 HTML 的 2 阶段转换 - 必须是更好的方法

如何检查 Solr 中使用了哪个 XSLT 处理器?

哪些浏览器支持 XSLT 2.0?