1

在 XML 文档中,例如:

<a>
  <b>
    <c>Text1</c>
    ...
  </b>
  <b>
    <c>Text2</c>
    ...
  </b>
  ...
</a>

如果任何元素包含“Text1”的内部文本,则返回 Null 集的单个 XPath 1.0 兼容、本地命名空间()兼容表达式是什么。

我尝试了许多不同的表达式,但无法获取会返回空集的元素。

例如

//*[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'])]
4

2 回答 2

1

如果任何元素包含“Text1”的内部文本,则返回 Null 集的单个 XPath 1.0 兼容、本地命名空间()兼容表达式是什么。

如果没有这样的元素,您还没有指定应该选择什么c,所以下面我在这种情况下选择顶部元素。

使用

/*[not(//c[. = 'Text1'])]

c如果XML 文档中有一个元素,其字符串值为“Text1”,这将不选择任何内容。

在使用默认命名空间的情况下,这将被写为

/*[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>
于 2013-01-23T15:32:12.367 回答
0

只是否定你的表达

not(//*[local-name()='c' and .='Text1'])

true如果没有,它将返回<c>Text1</c>,否则,它不会返回任何内容。

于 2013-01-23T11:30:49.137 回答