正如我在线程标题中已经提到的,我想删除一个节点或元素,具体取决于同一级别中另一个元素的值。
要防止重复标记,问题不是从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解决这个问题。
我想提前感谢你。
答案 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"/>