Xml XSL选择所有节点,其中不是另一个节点的节点
这是我的xmlXml XSL选择所有节点,其中不是另一个节点的节点,xml,xslt,xpath,Xml,Xslt,Xpath,这是我的xml <element1> <subel1/> </element1> <element2> <subel2/> </element2> <element3> <subel3/> </element3> <criteria> <subel3/> </criteria> 如何使用xsl选择所有不在条件子节点中的节点? 像这样 <su
<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>
subel1
subel2
subel3
您是否缺少XML代码?如果您输入代码并在编辑器中将其标记为sourcecode(带有“101 010”的按钮),会更容易提供帮助。您是否缺少xmlcode?如果您输入代码并在编辑器中将其标记为sourcecode(带有“101 010”的按钮),则会更容易提供帮助。最简单的方法是构造一个xpath表达式,该表达式将对照条件节点进行交叉检查。例如:
步骤1:以下步骤将选择不在“条件”区域中的所有节点(因此,所有没有名为“条件”的父节点的节点)
步骤2:过滤掉也出现在critera部分的所有节点
//*[name(..) != 'criteria' and not(name(//criteria/*) = name(.))]
现在,最后一条语句将选择与条件节点不匹配的所有节点。但是您只需要子节点,因此我们可以修改选择器,只获取“子元素”元素或没有子节点的叶元素
//*[name(..) != 'criteria' and not(name(//criteria/*) = name(.)) and not(*)]
下面是我们每一个条件的细目:
姓名(…)!='criteria'--对不在criteria部分中的节点的限制
not(name(//criteria/*)=name(.)--对与条件部分中的节点名称不同的节点的限制
and not(*)-对没有任何子节点的节点进行限制(因此可以选择所需的叶节点。)
因此,如果你要做一些类似的事情:
<xsl:for-each select="//*[name(..) != 'criteria' and not(name(//criteria/*) = name(.)) and not(*)]">
<xsl:value-of select="name(current())"/> :
</xsl:for-each>
希望这有帮助
干杯
Casey实现这一点的最简单方法是构造一个xpath表达式,该表达式根据条件节点进行交叉检查。例如: 步骤1:以下步骤将选择不在“条件”区域中的所有节点(因此,所有没有名为“条件”的父节点的节点) 步骤2:过滤掉也出现在critera部分的所有节点
//*[name(..) != 'criteria' and not(name(//criteria/*) = name(.))]
现在,最后一条语句将选择与条件节点不匹配的所有节点。但是您只需要子节点,因此我们可以修改选择器,只获取“子元素”元素或没有子节点的叶元素
//*[name(..) != 'criteria' and not(name(//criteria/*) = name(.)) and not(*)]
下面是我们每一个条件的细目:
姓名(…)!='criteria'--对不在criteria部分中的节点的限制
not(name(//criteria/*)=name(.)--对与条件部分中的节点名称不同的节点的限制
and not(*)-对没有任何子节点的节点进行限制(因此可以选择所需的叶节点。)
因此,如果你要做一些类似的事情:
<xsl:for-each select="//*[name(..) != 'criteria' and not(name(//criteria/*) = name(.)) and not(*)]">
<xsl:value-of select="name(current())"/> :
</xsl:for-each>
希望这有帮助
干杯
凯西这一转变:
<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>
产生想要的结果(在撰写本文时,没有其他已发布的答案产生正确的结果):
逐步解释:
<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>
/*/*[非(自身::标准)]/*
“criteria”
的元素且是文档顶部元素的子元素的每个元素
指令中,我们检查当前节点的名称是否不是条件的任何子节点的名称之一,并且只复制这样一个节点:
self::node()
此XPath表达式仅当不存在与当前节点名称相同的/*/criteria
的子节点时才选择当前节点(self::node()
),而该子节点的名称与当前节点的名称相同(不是(/*/criteria/*[name()=name(current()))
)
这里我们使用这样一个事实,即not(someNode Set)
只有在nodesetsomeNode Set
为空时才是false() 此转换:
<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>
产生想要的结果(在撰写本文时,没有其他已发布的答案产生正确的结果):
逐步解释:
<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>
XPath表达式:
/*/*[非(自身::标准)]/*
选择其父元素不是命名为“criteria”
的元素且是文档顶部元素的子元素的每个元素
在
指令中,我们检查当前节点的名称是否不是条件的任何子节点的名称之一,并且只复制这样一个节点:
self::node()
此XPath表达式仅当不存在与当前节点名称相同的/*/criteria
的子节点时才选择当前节点(self::node()
),而该子节点的名称与当前节点的名称相同(不是(/*/criteria/*[name()=name(current()))
)
这里我们使用这样一个事实,即not(someNode Set)
只有在nodesetsomeNode Set
为空时才是false() 好问题(+1)。请参阅我的答案,以获得完整且唯一正确的解决方案。好问题(+1)。请参阅我的答案,以获取完整且唯一正确的解决方案。此解决方案应用于我的答案中的XML文档时,会生成两个元素名称,但正确的结果只有一个元素名称。事实上,我的解决方案不适用于您提供的XML。但是,这与他提供的xml不同。我的解决方案确实适用于他的xml。也就是说,您的解决方案更加健壮。这就是我为什么要得分的原因!这个解决方案应用于我的答案中的XML文档时会产生两个元素名,但正确的结果只有一个元素名。但是,这与他提供的xml不同。我的解决方案确实适用于他的xml。也就是说,您的解决方案更加健壮。这就是我为什么要得分的原因!