gpt4 book ai didi

java - 如何使用 Java 或 XSLT 删除空 XML 节点

转载 作者:行者123 更新时间:2023-12-01 22:50:58 25 4
gpt4 key购买 nike

我有以下 XML 文档:

<?xml version="1.0" encoding="utf-8"?>
<greatGrandParent>
<grandParent>
<parent>
<sibling>Fred</sibling>
<sibling>Max</sibling>
<sibling>Katie</sibling>
</parent>
<parent>
<sibling>Lindy</sibling>
<sibling>Richard</sibling>
</parent>
<parent>
<sibling />
</parent>
</grandParent>
<grandParent>
<parent>
<sibling>Steve</sibling>
<sibling>Abbas</sibling>
</parent>
<parent>
<sibling>Kate</sibling>
<sibling>James</sibling>
<sibling>Ian</sibling>
</parent>
</grandParent>
<grandParent>
<parent>
<sibling />
</parent>
</grandParent>
</greatGrandParent>

我的要求是 - 如果 XML 节点的所有子元素均为空,则删除该节点。例如,在上面显示的 XML 中,

  • 第一祖 parent 的第三 parent 没有 sibling 。因此,应该删除 sibling 。由于父级没有兄弟级,因此也应从 XML 中删除父级。但是,祖 parent 仍然存在,因为它还有其他 parent 和 sibling 。

  • 第三祖 parent 中唯一的 parent 没有 sibling 。因此,需要删除 sibling 。由于父级没有 sibling ,因此父级也应该被删除。由于grandParent 没有子元素(parent),因此grandParent 也必须从XML 中删除。

因此,生成的 XML 必须如下所示:

<?xml version="1.0" encoding="utf-8"?>
<greatGrandParent>
<grandParent>
<parent>
<sibling>Fred</sibling>
<sibling>Max</sibling>
<sibling>Katie</sibling>
</parent>
<parent>
<sibling>Lindy</sibling>
<sibling>Richard</sibling>
</parent>
</grandParent>
<grandParent>
<parent>
<sibling>Steve</sibling>
<sibling>Abbas</sibling>
</parent>
<parent>
<sibling>Kate</sibling>
<sibling>James</sibling>
<sibling>Ian</sibling>
</parent>
</grandParent>
</greatGrandParent>

如果有人可以建议我使用任何 Java API 或 XSLT 来执行此操作的解决方案,我会很高兴。

最佳答案

为此,您可以使用以下 XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="fn xs">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:if test="normalize-space(string(.)) != ''">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:if>
</xsl:template>
</xsl:stylesheet>

要了解它的工作原理,请执行下一个 XSLT,它会在 grandParent 节点上提供一个额外的元素,另请阅读这个小教程:http://www.xmlplease.com/xsltidentity

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

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

<xsl:template match="grandParent">
<xsl:copy>
<xsl:apply-templates select="@*" />
<childValues><xsl:value-of select="normalize-space(.)" /></childValues>
<xsl:apply-templates select="node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

关于java - 如何使用 Java 或 XSLT 删除空 XML 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24735506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com