使用 XSLT 删除 XML 中的空子元素
Remove empty child elements in XML using XSLT
我的输入XML如下,
<OUTPUT-AREA><TIME-CD>A</TIME-CD>
<ID-G>
<Table-ID-T>
<AT-ID-T>YYYX</AT-ID-T>
<AT-ID-T/>
<AT-ID-T/>
</Table-ID-T>
</ID-G>
</OUTPUT-AREA>
我的输出XML应该是这样的,
<OUTPUT-AREA>
<TIME-CD>A</TIME-CD>
<ID-G>
<Table-ID-T>
<AT-ID-T>YYYX</AT-ID-T>
</Table-ID-T>
</ID-G>
</OUTPUT-AREA>
我只想删除具有空值的子元素。在上面的示例中,我只想删除具有空值的 <AT-ID-T>
元素。
但是 Table-ID-T 或 ID-G 不应删除。
这里的一个挑战是,假设如果所有子元素都具有空值,那么至少一个子元素应该
保留在 Table 或数组中。
例如输入XML是
<OUTPUT-AREA>
<TIME-CD>A</TIME-CD>
<ID-G>
<Table-ID-T>
<AT-ID-T/>
<AT-ID-T/>
<AT-ID-T/>
</Table-ID-T>
</ID-G>
</OUTPUT-AREA>
那么输出应该是这样的,
<OUTPUT-AREA>
<TIME-CD>A</TIME-CD>
<ID-G>
<Table-ID-T>
<AT-ID-T/>
</Table-ID-T>
</ID-G>
</OUTPUT-AREA>
请提供符合要求的合适的XSLT。
请在下面找到我试过的 XSLT,
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://ACORD.org/Standards/Life/2">
<xsl:output encoding="UTF-8" indent="no" omit-xml-declaration="no"/>
<xsl:template match="/">
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="*">
<xsl:if test=".!=''">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:if>
</xsl:template>
在应用以上 XSLT 时,删除了所有具有空值的元素。但我只需要删除子元素。
假设您知道要删除的空元素的名称(例如 AT-ID-T
),然后使用
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Table-ID-T[not(AT-ID-T[normalize-space()])]/AT-ID-T[position() > 1]
| Table-ID-T[AT-ID-T[normalize-space()]]/AT-ID-T[not(normalize-space())]"/>
</xsl:transform>
另一个输入样本的在线示例 http://xsltransform.net/ej9EGcX for one input sample and http://xsltransform.net/ej9EGcX/2。
我尝试了以下方法及其工作方式:
<xsl:template match="node()[.='']"/>
<xsl:template match="Table-ID-T/*[1]">
<xsl:copy-of select="."/>
</xsl:template>
我的输入XML如下,
<OUTPUT-AREA><TIME-CD>A</TIME-CD>
<ID-G>
<Table-ID-T>
<AT-ID-T>YYYX</AT-ID-T>
<AT-ID-T/>
<AT-ID-T/>
</Table-ID-T>
</ID-G>
</OUTPUT-AREA>
我的输出XML应该是这样的,
<OUTPUT-AREA>
<TIME-CD>A</TIME-CD>
<ID-G>
<Table-ID-T>
<AT-ID-T>YYYX</AT-ID-T>
</Table-ID-T>
</ID-G>
</OUTPUT-AREA>
我只想删除具有空值的子元素。在上面的示例中,我只想删除具有空值的 <AT-ID-T>
元素。
但是 Table-ID-T 或 ID-G 不应删除。
这里的一个挑战是,假设如果所有子元素都具有空值,那么至少一个子元素应该 保留在 Table 或数组中。
例如输入XML是
<OUTPUT-AREA>
<TIME-CD>A</TIME-CD>
<ID-G>
<Table-ID-T>
<AT-ID-T/>
<AT-ID-T/>
<AT-ID-T/>
</Table-ID-T>
</ID-G>
</OUTPUT-AREA>
那么输出应该是这样的,
<OUTPUT-AREA>
<TIME-CD>A</TIME-CD>
<ID-G>
<Table-ID-T>
<AT-ID-T/>
</Table-ID-T>
</ID-G>
</OUTPUT-AREA>
请提供符合要求的合适的XSLT。
请在下面找到我试过的 XSLT,
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://ACORD.org/Standards/Life/2">
<xsl:output encoding="UTF-8" indent="no" omit-xml-declaration="no"/>
<xsl:template match="/">
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="*">
<xsl:if test=".!=''">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:if>
</xsl:template>
在应用以上 XSLT 时,删除了所有具有空值的元素。但我只需要删除子元素。
假设您知道要删除的空元素的名称(例如 AT-ID-T
),然后使用
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Table-ID-T[not(AT-ID-T[normalize-space()])]/AT-ID-T[position() > 1]
| Table-ID-T[AT-ID-T[normalize-space()]]/AT-ID-T[not(normalize-space())]"/>
</xsl:transform>
另一个输入样本的在线示例 http://xsltransform.net/ej9EGcX for one input sample and http://xsltransform.net/ej9EGcX/2。
我尝试了以下方法及其工作方式:
<xsl:template match="node()[.='']"/>
<xsl:template match="Table-ID-T/*[1]">
<xsl:copy-of select="."/>
</xsl:template>