私はXPath(1.0)を使用して、それ自体または任意の祖先が特定のパラメーター値を持つ特定の型のすべての要素を取得しようとしています。トリックは、パラメータが値のリストになることができるので、@ parameter = 'value'を探すだけではできません。これは、私の場合のための文書の一例であり、それらまたはその祖先のいずれかのいずれかを持っているのは、私は外部参照要素を探しています言わせプラットフォーム=「モバイル」:XPath先祖または自己解決の順序
<doc>
<block>
<xref platform="mobile desktop">1</xref>
</block>
<block platform="mobile">
<xref platform="desktop">2</xref>
</block>
<block platform="desktop">
<xref platform="mobile">3</xref>
</block>
</doc>
I(いくつかの助けを借りて)目標は、同時に外部参照の祖先と自分自身のためのプラットフォームのすべての値を連結するための連結のためだった、とモバイルがそこにあったならば、参照
//xref[contains(concat(' ', normalize-space(ancestor-or-self::*/@platform), ' '), ' mobile ')]
:ほとんどそれを作るように見える次のXPathを思い付きました。したがって、サンプルドキュメントでは3つの外部参照をすべて返す必要がありますが、3つ目の外部参照は省略します。私は先祖または自己がルートレベルから評価していると思うので、実際に残りの祖先または自己をチェックすることなく、モバイルではないプラットフォームが見つかると失敗します。さらに、この動作では、一度に1つのノードのプラットフォーム値だけを見ているので、連結は実際に何もしません。
誰もこの特定のケースを解決する方法を知っていますか?
ありがとう、これは私が探していたものです!私は一点で似たようなことを試していたことを知っていたので、私は自分の試みを見て、このようなものを見つけました。正直言って私はなぜそこにいるべきではないのかを理解することはできませんが、ありがとう! –
@AndresMataようこそ!私はそれを次のように考えるでしょう:述語( '[...]')はコンテキストノードを適用する必要があり、コンテキストは左のノードです。 '/ ancestor-or-self :: * [...]'との対比以外は、述語の左には何もないので、 '/ [...]'は正しい構文ではありません。 'ancestor-or-self :: *'は述語のコンテキストになります – har07