XPath - 如果元素的单个实例包含特定文本,则返回Null

时间:2013-01-23 11:22:01

标签: .net xml xpath xmlnode xpath-1.0

在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'])]

2 个答案:

答案 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>,否则,它不会返回任何内容。