2

私の XML は次のようになります。

<root>
  <child1>
    <grandchild1>{tagID1}<grandchild1/>
    <grandchild2>{tag2}<grandchild2/>
  </child1>
  <child2>{newtag1}<child2/>
<root/>

text() が "{*}" のようなすべての要素を取得しようとしています。つまり、2 つのカーリーの間に文字列が含まれていますが、xpath にはあまり詳しくありません。

xquery構文は次のようになると思いました

"//*[matches(., '{*}')]"

しかし、それは不明なメソッド「-->matches(.<--」で失敗しています

誰かが私を訂正していただければ幸いです。

4

2 に答える 2

4

このmatches()関数はXPath2.0で使用できますが、XPathエンジンはおそらくXPath1.0のみをサポートします。

その場合は、次のような結果になる必要があります。

//*[./text()[starts-with(., '{') and substring(., string-length(.), 1)='}']]

それは探します

ANY ELEMENT
//*
   THAT HAS A TEXT NODE
   [./text()                                                               ]
            WHICH STARTS WITH A '{'
            [starts-with(., '{')                                          ]
                                 AND ENDS WITH A '}'
                                 and substring(., string-length(.), 1)='}'

関数呼び出しは、XPath 1.0に関数があった場合に、関数substring()に期待することを実行します。ends-with()


編集starts-with()(見つからないというOPのコメントにも対処するため)

を知らないXPathエンジンを見たことがありませんstarts-with()。少なくともsubstring()機能を認識している場合は、次の回避策を試すことができます。

//*[./text()[substring(., 1, 1)='{' and substring(., string-length(.), 1)='}']]

同じことをする必要があります。

于 2013-02-27T11:07:17.160 に答える
3

XPath は正しいように見えますが、xml と正規表現が間違っています。

{} は特別な文字であり、\ でエスケープする必要があります。また、* は単独では使用できません。したがって、正しい式は次のとおりです (. の代わりに text() を使用するため、すべての子孫のテキストはチェックされません)。

//*[matches(text(), '\{.*\}')]

この関数は XPath 2 (および XQuery はスーパーセットであるため) でのみ使用できますが、完全な名前を試すことができますfn:matches

xml では、終了スラッシュは反対側にある必要があります。

<root>
  <child1>
    <grandchild1>{tagID1}</grandchild1>
    <grandchild2>{tag2}</grandchild2>
  </child1>
  <child2>{newtag1}</child2>
</root>
于 2013-02-27T11:11:06.710 に答える