XSLT:从某个深度删除空元素

时间:2017-08-17 14:10:27

标签: xslt

我正在尝试创建一个xslt,它将“清理”许多不同进程的输出。我想删除所有空元素,但有些元素应该总是存在。

例如以下

<soap:Envelope>
  <soap:Body>
    <typ:GetSomeStuffReturn>
      <typ:abcd>qwer</typ:abcd>
      <typ:efgh/>
      <typ:ijkl>asdf</typ:ijkl>
    </typ:GetSomeStuffReturn>
  </soap:Body>
</soap:Envelope> 

应该成为

<soap:Envelope>
  <soap:Body>
    <typ:GetSomeStuffReturn>
      <typ:abcd>qwer</typ:abcd>
      <typ:ijkl>asdf</typ:ijkl>
    </typ:GetSomeStuffReturn>
  </soap:Body>
</soap:Envelope>     

足够简单,有很多例子可以实现这一点。

然而,这个例子

<soap:Envelope>
  <soap:Body>
    <typ:GetSomeStuffReturn>
      <typ:abcd/>
      <typ:efgh/>
      <typ:ijkl/>
    </typ:GetSomeStuffReturn>
  </soap:Body>
</soap:Envelope> 

应该成为

<soap:Envelope>
  <soap:Body>
    <typ:GetSomeStuffReturn/>
  </soap:Body>
</soap:Envelope>  

我无法弄清楚如何做到这一点。我尝试的所有内容都与一个或另一个例子一起使用,但从来没有。

更复杂的是,代码也需要工作而不管第三个节点是什么,它很可能总是以'Return'结尾

我总是需要信封,身体和第三个节点,所以

<soap:Envelope>
  <soap:Body>
    <typ2:LookupThingsReturn>
      <typ2:wxyz/>
      <typ2:stuv/>
    </typ2:LookupThingsReturn>
  </soap:Body>
</soap:Envelope>

应该成为

<soap:Envelope>
  <soap:Body>
    <typ2:LookupThingsReturn/>
  </soap:Body>
</soap:Envelope>  

感激不尽的任何帮助或建议。

1 个答案:

答案 0 :(得分:1)

尝试:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="*[not(node()) and count(ancestor::*) > 2]"/>

</xsl:stylesheet>
相关问题