从同一级别的另一个元素中按值删除XML节点/元素
正如我在线程标题中已经提到的,我想删除一个节点或元素,这取决于同一级别中另一个元素的值 为了防止重复标记,问题不在于从xml中删除元素或节点,而在于从同一子节点/级别的另一个元素中删除与值相关的节点或元素。 为了说明这一点,我用随机样本数据构建了一个示例结构从同一级别的另一个元素中按值删除XML节点/元素,xml,xslt,Xml,Xslt,正如我在线程标题中已经提到的,我想删除一个节点或元素,这取决于同一级别中另一个元素的值 为了防止重复标记,问题不在于从xml中删除元素或节点,而在于从同一子节点/级别的另一个元素中删除与值相关的节点或元素。 为了说明这一点,我用随机样本数据构建了一个示例结构 <ROOT> <DETAILS> <ALLOC> <TYPE>NEEDED</TYPE> <VALUE
<ROOT>
<DETAILS>
<ALLOC>
<TYPE>NEEDED</TYPE>
<VALUE>do not remove</VALUE>
<NAME>also requiered</NAME>
</ALLOC>
</DETAILS>
<DETAILS>
<ALLOC>
<TYPE>UNNEEDED</TYPE>
<VALUE>remove this</VALUE>
<NAME> but this requiered</NAME>
</ALLOC>
</DETAILS>
<DETAILS>
<ALLOC>
<TYPE>NEEDED</TYPE>
<VALUE>do not remove</VALUE>
<NAME>also requiered</NAME>
</ALLOC>
</DETAILS>
<SOMEWHERE>
<OTHERWHERE>
<TYPE>UNNEEDED</TYPE>
<VALUE>but do not remove</VALUE>
<NAME>also requiered</NAME>
</OTHERWHERE>
</SOMEWHERE>
</ROOT>
需要
不要移除
也要求
多余的
去掉这个
但这要求
需要
不要移除
也要求
多余的
但不要移除
也要求
现在,如果同一节点中类型的文本值“不需要”,我需要一个xsl转换来删除节点值
此转换的inpur参数如下所示
if:/ROOT/DETAILS/ALLOC/TYPE=不需要
然后删除:/ROOT/DETAILS/ALLOC/VALUE
可能是定义了多个删除,所以我必须删除一个或多个元素
if:/ROOT/DETAILS/ALLOC/TYPE=不需要
然后删除:/ROOT/DETAILS/ALLOC/VALUE/ROOT/DETAILS/ALLOC/otherElement
+搜索字符串“UNNEEDED”是示例性的,可以是任何内容(名称、描述、标识符)
要通过简单的xpath表达式删除节点,请在所有节点上删除节点值。按索引删除节点这是不可能的。我必须动态转换xml结构。结构可以包含此值,但不必包含
所以期望的输出是
<ROOT>
<DETAILS>
<ALLOC>
<TYPE>NEEDED</TYPE>
<VALUE>do not remove</VALUE>
<NAME>also requiered</NAME>
</ALLOC>
</DETAILS>
<DETAILS>
<ALLOC>
<TYPE>UNNEEDED</TYPE>
- - - - - - - - - - -
<NAME> but this requiered</NAME>
</ALLOC>
</DETAILS>
<DETAILS>
<ALLOC>
<TYPE>NEEDED</TYPE>
<VALUE>do not remove</VALUE>
<NAME>also requiered</NAME>
</ALLOC>
</DETAILS>
<SOMEWHERE>
<OTHERWHERE>
<TYPE>UNNEEDED</TYPE>
<VALUE>but do not remove</VALUE>
<NAME>also requiered</NAME>
</OTHERWHERE>
</SOMEWHERE>
</ROOT>
需要
不要移除
也要求
多余的
- - - - - - - - - - -
但这要求
需要
不要移除
也要求
多余的
但不要移除
也要求
[只有XPATH:/ROOT/DETAILS/ALLOC中的元素'Value'必须删除,但XPATH/ROOT/某处/OTHERWHERE中的元素'Value'不能删除]
通过无索引xpath表达式删除节点,删除此xpath上所有子节点的节点值
通过索引xpath表达式删除节点也是不可能的,因为我以前不知道索引。给定的xpath表达式是无索引的,我必须检查类型的文本值是否为'something',然后删除节点'value'
我只能通过xml和xslt来解决这个问题
我想提前向您表示感谢。请尝试以下方式:
XSLT1.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>
试着这样做:
XSLT1.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>
谢谢你的主意,迈克尔。霍尔257K。我也试过这种方法。它会起作用,但问题是元素的相对路径。可能是相对路径可以在其他地方找到,并且也会修改此节点。@Hans.Olo,您的评论有点不清楚。可能是一个有帮助的示例。@Hans.Olo如果它有一个值为
“不需要的”
的同级类型
,这将删除值。如果你说“在同一水平”是指其他东西,你需要澄清。早上好,伙计们,我已经编辑了这个问题,并试图更好地解释它。我希望它现在更容易理解。我可以用你的方法解决这个问题,它相对简单。我觉得已经太复杂了。谢谢你的主意,迈克尔。霍尔257K。我也试过这种方法。它会起作用,但问题是元素的相对路径。可能是相对路径可以在其他地方找到,并且也会修改此节点。@Hans.Olo,您的评论有点不清楚。可能是一个有帮助的示例。@Hans.Olo如果它有一个值为“不需要的”
的同级类型
,这将删除值。如果你说“在同一水平”是指其他东西,你需要澄清。早上好,伙计们,我已经编辑了这个问题,并试图更好地解释它。我希望它现在更容易理解。我可以用你的方法解决这个问题,它相对简单。我觉得已经太复杂了。