我正在尝试创建一个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>
感激不尽的任何帮助或建议。
答案 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>