从同一级别的另一个元素中删除XML节点/元素

时间:2016-11-02 12:33:49

标签: xml xslt

正如我在线程标题中已经提到的,我想删除一个节点或元素,具体取决于同一级别中另一个元素的值。

要防止重复标记,问题不是从xml中删除元素或节点,而是从同一子节点/级别中的另一个元素中删除值的节点或元素依赖。 < / p>

为了描述这个,我构建了一个包含随机样本数据的示例结构。

DECIMAL

现在我需要一个xsl转换来删除节点VALUE 如果类型的文本值在同一节点中是&#34; UNNEEDED&#34;。

此转换的inpur参数看起来像那样 如果:/ ROOT /信息/ ALLOC / TYPE =不必要 然后删除:/ ROOT / DETAILS / ALLOC / VALUE

可能是定义了多个删除,因此我必须删除一个或多个元素。

如果:/ ROOT /信息/ ALLOC / TYPE =不必要 然后删除:/ ROOT / DETAILS / ALLOC / VALUE; / ROOT /信息/ ALLOC / otherElement;

+搜索字符串&#34; UNNEEDED&#34;是示例性的,可以是任何东西(名称,描述,标识符)

要通过简单的xpath表达式删除节点,请在所有节点上删除节点值。通过索引删除节点它是不可能的。我想改造一个动态的xml结构。结构可以包含此值,但不一定必须。

所以期望的输出是

MA_DECIMAL

[只有元素&#39;价值&#39;在XPATH:/ ROOT / DETAILS / ALLOC必须删除,但不是元素&#39;值&#39;在XPATH / ROOT / SOMEWHERE / OTHERWHERE]中

通过无索引xpath表达式删除节点,删除此xpath上的节点VALUE所有子节点 通过索引删除节点xpath表达式也是不可能的,因为之前我不知道索引。给定的xpath表达式是无索引的,我必须检查类型的文本值是否是&#39;某事物&#39;然后删除节点&#39;值&#39;。

我必须通过xml和xslt解决这个问题。

我想提前感谢你。

1 个答案:

答案 0 :(得分:2)

以这种方式尝试:

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="VALUE[../TYPE='UNNEEDED']"/>

</xsl:stylesheet>

加了:

要仅将删除限制为VALUE的子节点ALLOC节点,请使用:

<xsl:template match="ALLOC[TYPE='UNNEEDED']/VALUE"/>