XSLT:从特定深度移除空元素
我正在尝试创建一个xslt,它将“清理”许多不同进程的输出。我想删除所有空元素,但其中一些应该始终存在 举个例子XSLT:从特定深度移除空元素,xslt,Xslt,我正在尝试创建一个xslt,它将“清理”许多不同进程的输出。我想删除所有空元素,但其中一些应该始终存在 举个例子 <soap:Envelope> <soap:Body> <typ:GetSomeStuffReturn> <typ:abcd>qwer</typ:abcd> <typ:efgh/> <typ:ijkl>asdf</typ:ijkl>
<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你不清楚三级元素的后代。看起来很完美。谢谢,很好。请注意,如果将
更改为=
,会发生什么情况。