XSLT:从特定深度移除空元素

XSLT:从特定深度移除空元素,xslt,Xslt,我正在尝试创建一个xslt,它将“清理”许多不同进程的输出。我想删除所有空元素,但其中一些应该始终存在 举个例子 <soap:Envelope> <soap:Body> <typ:GetSomeStuffReturn> <typ:abcd>qwer</typ:abcd> <typ:efgh/> <typ:ijkl>asdf</typ:ijkl>

我正在尝试创建一个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> 

qwer
asdf
应该成为

<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>
    <typ2:LookupThingsReturn/>
  </soap:Body>
</soap:Envelope>  

qwer
asdf
很简单,有很多例子可以说明如何做到这一点

然而,这个例子

<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>
    <typ:GetSomeStuffReturn>
      <typ:abcd>qwer</typ:abcd>
      <typ:ijkl>asdf</typ:ijkl>
    </typ:GetSomeStuffReturn>
  </soap:Body>
</soap:Envelope>     
<soap:Envelope>
  <soap:Body>
    <typ2:LookupThingsReturn/>
  </soap:Body>
</soap:Envelope>  

感谢您提供的任何帮助或建议。

请尝试:

XSLT1.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>


展示你已经完成的工作当你说“我想删除所有空元素,但有些应该始终存在”时,你似乎自相矛盾。我想你的意思是你想从输入树中复制除空元素以外的所有元素,并且你承认这样做可能会在输出树中产生空节点。此外,还不清楚你是否将特殊意义归于第三级输入元素——例如,即使这些元素在输入树中为空,也必须始终将其复制到结果树中吗?还是只有那些元素的子元素如果为空就必须剥离?我已经做的工作基本上是复制这里的许多相关问题的示例,并试图对它们进行调整,但都没有成功。@ChrisE你不清楚三级元素的后代。看起来很完美。谢谢,很好。请注意,如果将
更改为
=
,会发生什么情况。