0

私はXPathを初めて使用するので、我慢してください。XPath式があります

'.//*[contains(.,"Obama")]/text()'

それは私に「オバマ」を含むテキストを取得します。しかし、私は追加する方法を理解することができませんでした

and [not(contains(., "Romney"))]構文エラーを取得せずに式に変換します。それはどのように行われますか?多くのappriciatedを助けてください!

4

2 に答える 2

1

これを試して:

'.//*[contains(.,"Obama")][not(contains(.,"Romney"))]/text()'

必要な数の述語を次々に配置できます。

[a][b][c]
于 2012-10-19T20:17:13.170 に答える
1

使用

.//*[contains(.,"Obama") and not(contains(.,"Romney"))]/text()

XSLTベースの検証

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     './/*[contains(.,"Obama") and not(contains(.,"Romney"))]/text()'/>
 </xsl:template>
</xsl:stylesheet>

この変換が次のXMLドキュメントに適用される場合:

<election>
 <choice>Maybe  Obama</choice>
 <choice>Maybe Romney</choice>
</election>

XPath式が評価され、選択したノードが出力にコピーされます。

Maybe  Obama

注意してください

SomeExpression[x][y]

常に同等であるとは限りません:

SomeExpression[x and y]

したがって、@ ChrisGerkenの回答で指定されているように、前者ではなく後者をお勧めします。

具体的な例を次に示します。

このXMLドキュメントを作成しましょう

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

そしてこれらの2つのXPath式

/*/*[. mod 3 = 0 and position() = 3]

/*/*[. mod 3 = 0][position() = 3]

最初の式は以下を選択します

<num>03</num>

ただし、2番目の式は以下を選択します

<num>09</num>

そして、これが完全なXSLTベースの検証です。

<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:copy-of select=
     "/*/*[. mod 3 = 0 and position() = 3]"/>
     ================
     <xsl:copy-of select=
     "/*/*[. mod 3 = 0][position() = 3]"/>

 </xsl:template>
</xsl:stylesheet>

この変換が上記のXMLドキュメントに適用されると、2つのXPath式が評価され、これらの評価の結果が出力にコピーされます。

<num>03</num>
================
<num>09</num>

説明

position()は*context-sensitive`関数であり、通常、k番目とm番目の述語で使用すると異なる結果を生成します。ここでk!= m

于 2012-10-19T20:33:25.310 に答える