6

XPathを使用して、「単語全体に一致」したいと思います(VS検索と同じように、ユーザーのオプション)。

大文字と小文字を区別しないなどのフラグを使用できますが、関数containsと機能は同様に機能するようです。matchesi

つまり、次の 2 つの XPath クエリで同じ結果が得られます。

<pets>
    <dog name="Rupert" color="grey"/>
    <dog name="Ralph" color="brown"/>
    <cat name="Marvin the Cat" color="white"/>
    <cat name="Garfield the Cat" color="orange"/>
    <cat name="Cat" color="grey"/>
    <cat name="Fluffy" color="black"/>
</pets>

Matches XPath: //cat[descendant-or-self::*[@*[matches(.,'Cat')]]]
    returns:
    <cat name="Marvin the Cat" color="white"/>
    <cat name="Garfield the Cat" color="orange"/>
    <cat name="Cat" color="grey"/>


Contains XPath: //cat[descendant-or-self::*[@*[contains(.,'Cat')]]]
    returns:
    <cat name="Marvin the Cat" color="white"/>
    <cat name="Garfield the Cat" color="orange"/>
    <cat name="Cat" color="grey"/>

matchesしかし、「Cat」の単語全体のみに一致する結果を返すために使用したいと思います。

<cat name="Cat" color="grey"/>

単語全体に一致するように一致クエリを調整するにはどうすればよいですか?

編集:大文字と小文字を区別しないフラグが必要なため、matches関数を引き続き使用する必要があることを忘れていました。

4

5 に答える 5

5

^および$文字をアンカーとして使用するのはどうですか?

//cat[descendant-or-self::*[@*[matches(.,'^Cat$')]]]

XQuery 1.0 および XPath 2.0 の正規表現構文から:

^$の 2 つのメタ文字が追加されます。デフォルトでは、メタ文字 ^は文字列全体の先頭に一致し、$は文字列全体の末尾に一致します。

于 2012-05-01T21:03:04.790 に答える
4

ここには、関連する 3 つの関数/演算子があります。

matches() は正規表現の一致を行います。これを使用して、アンカー (^cat$) を使用して部分文字列または文字列全体に一致させることができます。また、'i' フラグを設定して大文字と小文字を区別しないようにすることもできます。

contains() は部分文字列の完全一致を行います。3 番目の引数 (照合) を使用して大文字と小文字を区別しない一致を要求できますが、照合を指定する方法は、使用しているプロセッサによって異なります。

eq 演算子は文字列全体の正確な一致を行います。「デフォルトの照合順序」(XPath の場合は通常、プロセッサの API を使用して設定されます) を使用して、大文字と小文字を区別しない照合を要求できます。これは要件に最も近いもののようです。唯一の欠点は、matches() で「i」フラグを使用するよりも、照合を指定する方がシステムに依存することです。

于 2012-05-01T22:48:42.870 に答える
2

ただし、一致を使用して、「Cat」の単語全体にのみ一致する結果を返したいと思います。

<cat name="Cat" color="grey"/>

必要な要素を選択するさまざまなXPath式があります

使用する:

/*/cat[matches(@name, '^cat$', 'i')]

または使用:

/*/cat[lower-case(@name) eq 'cat']

XSLTベースの検証

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:copy-of select=
   "/*/cat[matches(@name, '^cat$', 'i')]"/>
======
  <xsl:copy-of select=
   "/*/cat[lower-case(@name) eq 'cat']"/>

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

提供されたXMLドキュメントに適用した場合:

<pets>
    <dog name="Rupert" color="grey"/>
    <dog name="Ralph" color="brown"/>
    <cat name="Marvin the Cat" color="white"/>
    <cat name="Garfield the Cat" color="orange"/>
    <cat name="Cat" color="grey"/>
    <cat name="Fluffy" color="black"/>
</pets>

この変換は、2つのXPath式を評価し、選択した要素を出力にコピーします

  <cat name="Cat" color="grey"/>
======
  <cat name="Cat" color="grey"/>
于 2012-05-02T01:47:26.397 に答える
2

これはうまくいきますか?

//cat[@*='Cat']
于 2012-05-01T20:23:18.497 に答える
1

これ:

//cat[@*='Cat']

結果:

<cat name="Cat" color="grey"/>

Xacobeoを使用して検証しました。

于 2012-05-01T20:24:10.007 に答える