1

次のような XML ドキュメントでは、次のようになります。

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

いずれかの要素に 'Text1' の内部テキストが含まれている場合に Null セットを返す単一の XPath 1.0 互換、local-namespace() 互換の式は何ですか?

さまざまな式を試しましたが、null セットを返す要素を取得できません。

例えば

//*[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 互換、local-namespace() 互換の式は何ですか?

そのような要素がない場合に何を選択するかを指定していないcため、この場合は最上位の要素を選択します。

使用:

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

cXML ドキュメント内に文字列値が "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 に答える