1

XPath を学べば学ぶほど、逆参照が必要になる

たとえば、中間ステップのいくつかの情報を発見した場合、後でその情報を使用する必要がある場合があります。この問題には実際には、述語式にも XPathes を含めることができるという少しの助けを借りた回避策があります。実用的なソリューションは次のようになります

/foo/item[@attrtocheck = ../../otheritem[@anotherattr]]

しかし、このアプローチの問題は、いくつかの基準で述語を評価するだけで、これに基づいて複数の結果を得ることができないことです。同じ @anotherattr のアイテムが他にもたくさんあっても集めきれません。したがって、より良い解決策は

/foo/item[@attrtocheck]/../../otheritem[@anotherattr=BACKREFERENCING_ATTRTOCHECK_VALUE] 

しかし、私が知っている限り、それは不可能です。

標準に解決策がない場合、いくつかのツール/ライブラリに拡張機能があるのではないでしょうか? 実際、私は独自のエンジンを実装しており、非標準の構文が既に存在する場合は、それを採用します。

更新: Michael Kay のコメントの後、この機能が恋しい理由についての詳細

実は私は、AST (Abstract syntax trees) の XPath 検索を実装しています。これを試みたのは私が初めてではありません ([Xpath AST] の Web 検索)。この種の検索により、ツリーのさまざまな部分間の非常に強い関係が明らかになります。たとえば、あるコンテキスト(たとえば、他のメソッド内)で呼び出しを見つけた場合、このシンボルが仮想関数として導入されているかどうか、およびそれが結果に出力されているかどうかを知りたいと思います。この場合、最初の検索で以前は不明だったシンボル (関数名) が生成され、それを次のサブパス (クラス宣言とそのキーワードの検索) で使用したいと考えています。したがって、後方参照は非常に役立ちます。

ASTに適用できれば、他の構造化データでもそのような関係を持つ可能性があると思います。

4

2 に答える 2

2

let .. returnXQueryでは、一時変数を宣言するために使用できます。このような:

 /foo/item[@attrtocheck]/(let $backreference := @attrtocheck return ../../otheritem[@anotherattr=$backreference]) 

また、XPath 2では、forループを使用してlet式をエミュレートできます。

 /foo/item[@attrtocheck]/(for $backreference in @attrtocheck return ../../otheritem[@anotherattr=$backreference]) 

または、意図したとおりにforループを使用して、「後方参照」なしで実行できます。

 for $value in /foo/item[@attrtocheck]/@attrtocheck  return otheritem[@anotherattr=$value]

そしてこの場合、比較は実存的であり、あなたはただ使うことができるので:

otheritem[@anotherattr = /foo/item/@attrtocheck]

(そしてところで、私は独自のXPath実装も作成し、変数宣言の構文((values:= / xx / a / @ id)[0]、/ xx / b [@id = $ values])を持っています。 :=変数を定義し、()[0]が$valuesが返されるシーケンスに含まれないようにします。)

于 2012-07-28T22:09:41.400 に答える
0

私は BeniBela ソリューション (Dimitre Novatchev も言及) を受け入れましたが、この機能には XPath 1.0 省略構文の単純さと表現力が欠けていることがわかりました。

以前に見つかった値を逆参照する独自の関数も実装することを検討しています。前のステップを相対的に参照するために負のオフセットを受け入れ、(式の開始から) 絶対的に正のオフセットを受け入れます。したがって、これは次のようになります

 /foo/item[@attrtocheck]/../../otheritem[@anotherattr=backref(-2)]

私が推測するように、XPathにはそのような関数はありません。一般的な構文を失うことはなく、パス中に前のステップを複数回参照すると、複数の for ステートメントよりも表現力豊かに見えます

于 2012-07-29T07:41:18.613 に答える