2012-05-01 8 views
5

XPathを使用して、「単語全体をマッチさせる」(VS検索の場合と同じように、XPath:単語全体をマッチさせる(大文字と小文字を区別しないフラグを使用してマッチ関数を使用)

containsmatchesの機能は同じように動作しますが、マッチは大文字小文字の区別がない場合はiのようなフラグを使用できます。言い換えれば

、私は、これら二つの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 name="Cat" color="grey"/> 

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

EDIT: 大文字と小文字の区別がないので、マッチ機能を使用する必要があることを忘れてしまいました。

答えて

5

^$文字をアンカーとして使用するとどうなりますか? RegEx Syntax in XQuery 1.0 and XPath 2.0から

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

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

+0

うーん..これは私が望む結果を与える。しかし、^ $アンカーについて説明できますか?私は前にそれらを使ったことがありません。 – developer

+0

答えにリンクを追加しました。「2つのメタキャラクター...」を参照してください。 –

+1

ありがとう、私はまだいくつかのテストを行う必要がありますが、これはトリックを行うようだ! – developer

2

これは機能しますか?

//cat[@*='Cat'] 
+0

私が探しているものではありません。私は大文字小文字の区別を必要としないので、matches関数を使いたいと思っています...(上記の編集を参照)。 – developer

1

この:私はXacobeoを使用して検証

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

:中

//cat[@*='Cat'] 

結果。

+0

私が探しているものではありません。私は大文字小文字の区別を必要としないので、matches関数を使いたいと思っています...(上記の編集を参照)。 – developer

+1

はこれを試してみてください@developer: '//猫は、[変換(@ * 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'、 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')= '猫']' これは、あなたが常にあなたが小文字として、一致する文字列を渡し前提としています。 –

2

ここには3つの機能/演算子があります。

matches()は正規表現にマッチします。部分文字列にマッチさせるか、アンカー(^ cat $)を使って文字列全体をマッチさせることができます。また、 'i'フラグをセットして大文字小文字を区別することもできます。

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

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

2

しかし、私は唯一の「猫」 単語全体と一致する結果を返すために試合を使用したい:

:希望要素を選択する別のXPath式があり

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

使用:

/*/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"/> 
関連する問題