我决定开一个新主题,因为在之前我没有准确地定义我期待的内容。 我输入的XML看起来:
<tag5>
<addresses/>
<identifiedBaseServices/>
<sharedGroups>
<names></names>
<types></types>
</tag5>
<contain>
<attributes/>
<addresses/>
<identifiedBaseServices/>
<sharedGroups>
<names></names>
<types></types>
</sharedGroups>
</contain>
<smth>
<tag1></tag1>
<tag3> TEXT </tag3>
</smth>
我想要的只是删除空节点,除了我明确定义的一些节点。例如,我不想删除
attributes,
所以xml OUTPUT应该看起来:
<contain>
<attributes/>
</contain>
<smth>
<tag3> TEXT </tag3>
</smth>
我正在寻找一些解决方案,几个小时之后我得到了像:
<xsl:strip-space elements="*"/>
<xsl:template match="*[descendant::text() or descendant-or-self::*/@*[string()]]">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="attributes[not(node())]" priority="1">
<xsl:copy>
<xsl:apply-templates select="@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[not(.//text() | .//@*)]"/>
</xsl:stylesheet>
它的工作原理几乎没有,但是如果是这样的话。包含一些数据。当所有内容都为null时,该XSL代码将删除所有空标记...
这里有人可以帮助我吗?提前谢谢..
答案 0 :(得分:1)
我认为这就是你想要的:
<?xml version="1.0" encoding="UTF-8" ?>
<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="*"/>
<xsl:template match="*[.//attributes] | attributes">
<xsl:element name="{local-name()}">
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="*[descendant::text() or descendant-or-self::*/@*[string()]]">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我已删除了您的文字模板 - 它正在删除您要保留的空节点。相反,我们有一个模板来匹配任何具有attributes
作为子节点或attributes
节点本身的节点。然后我们保留该标签并忽略其余的孩子。如果你想将这些属性保存在attributes
节点上,我认为这不会处理属性(XML属性)。
采取此文件:
<rt>
<tag5>
<addresses/>
<identifiedBaseServices/>
<sharedGroups>
<names/>
<types/>
</sharedGroups>
</tag5>
<contain>
<attributes/>
<addresses/>
<identifiedBaseServices/>
<sharedGroups>
<names/>
<types/>
</sharedGroups>
</contain>
<smth>
<tag1/>
<tag3> TEXT </tag3>
</smth>
</rt>
并产生此输出:
<?xml version="1.0" encoding="UTF-8"?>
<rt>
<contain>
<attributes/>
</contain>
<smth>
<tag3> TEXT </tag3>
</smth>
</rt>