在XML文档中,例如:
<a>
<b>
<c>Text1</c>
...
</b>
<b>
<c>Text2</c>
...
</b>
...
</a>
什么是单个XPath 1.0兼容的local-namespace()兼容表达式,如果任何元素包含'Text1'的内部文本,则返回Null集。
我尝试了很多不同的表达式,并且无法获取会返回空集的元素。
e.g。
//*[local-name()='c' and .='Text1']
- or -
/*[local-name()='a']/*[local-name()='b']/*not(local-name()='c' and .='Text1'])
严格的要求是由于.NET函数调用的特定实现XmlNode.SelectSingleNode方法(字符串)
最终确切解决方案 礼貌Dimitre
/*[not(//*[local-name()='c' and . = 'Text1'])]
答案 0 :(得分:1)
什么是单个XPath 1.0兼容,本地命名空间() - 兼容, 表达式,如果任何元素包含内部文本,则返回Null集 &#39; Text1&#39;。
如果没有这样的c
元素,您还没有指定应该选择的内容,所以在下面我选择顶部元素。
使用强>:
/*[not(//c[. = 'Text1'])]
如果XML文档中存在c
元素,则不会选择任何内容,其字符串值为&#34; Text1&#34;。
如果使用默认命名空间,则会将其写为:
/*[not(//*[name()='c' and . = 'Text1'])]
基于XSLT的验证:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:copy-of select="/*[not(//c[. = 'Text1'])]"/>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<a>
<b>
<c>Text1</c>
...
</b>
<b>
<c>Text2</c>
...
</b>
...
</a>
评估XPath表达式,并将此评估的结果复制到输出中 - 在这种情况下,不会产生任何内容 - 正如预期的那样。
如果我们将上述XML文档更改为:
<a>
<b>
<c>Text3</c>
...
</b>
<b>
<c>Text2</c>
...
</b>
...
</a>
则条件为true()
,评估结果为以顶部元素为根的子树:
<a>
<b>
<c>Text3</c>
...
</b>
<b>
<c>Text2</c>
...
</b>
...
</a>
答案 1 :(得分:0)
只是否定你的表达
not(//*[local-name()='c' and .='Text1'])
如果没有true
,它将返回<c>Text1</c>
,否则,它不会返回任何内容。