gpt4 book ai didi

xml - XSL 选择所有节点,而不是另一个节点的节点

转载 作者:行者123 更新时间:2023-12-02 12:37:08 25 4
gpt4 key购买 nike

这是我的 xml

<element1> <subel1/> </element1> <element2> <subel2/> </element2> <element3> <subel3/> </element3> <criteria> <subel3/> </criteria>

我如何选择所有不在标准子节点中的具有xsl的节点?像这些

 <subel1/> <subel2/>

这是如何完成的?

如果 xml 格式为:

<element1> 
<el> subel1 </el>
</element1>
<element2>
<el> subel2
</el>
</element2>
<element3>
<el> subel3 </el>
</element3>
<criteria>
<subel3/>
</criteria>

最佳答案

这种转变:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>

<xsl:template match="/">
<xsl:for-each select=
"/*/*[not(self::criteria)]/*">
<xsl:copy-of select=
"self::node()[not(/*/criteria/*[name()=name(current())])]"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

应用于此 XML 文档时(基于提供的 XML 片段,但将 XML 片段包装在顶部元素内,并向 criteria 添加一个子元素,以使问题变得不那么简单):

<t>
<element1>
<subel1/>
</element1>
<element2>
<subel2/>
</element2>
<element3>
<subel3/>
</element3>
<criteria>
<subel3/>
<subel1/>
</criteria>
</t>

产生想要的结果(在撰写本文时没有其他已发布的答案产生正确的结果):

<subel2/>

分步说明:

  1. XPath 表达式:

    /*/*[not(self::criteria)]/*

选择其父元素是未命名的元素的每个元素 "criteria"它是文档顶部元素的子元素。

  • <xsl:for-each>内指令我们检查当前节点的名称是否不是 criteria 的任何子节点的名称之一并且只复制这样的节点:
  • self::node()[not(/*/criteria/*[name()=name(current())])]

    仅当 self::node() 的子节点不存在时,此 XPath 表达式才会选择当前节点 ( /*/criteria ) ,其名称与当前节点的名称( not(/*/criteria/*[name()=name(current())]) )相同。

    这里我们使用 not(someNode-Set) 的事实是 false()仅当节点集 someNode-Set是空的。

    关于xml - XSL 选择所有节点,而不是另一个节点的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3440449/

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