兄弟a/c
を持つすべての要素を一致させようとしています。b
私はもう試した:
<xsl:template match="a/b/../c">
しかし、Saxonから「式{..}をパターンに変換できません」というメッセージが表示されます。
私のXSLT/XPathスキルはせいぜい基本的なものです...
<xsl:template match="a[b]/c">
説明:子を持つ要素c
の子であるすべての要素に一致します。a
b
..
また、述語で使用できる必要があります。
<xsl:template match="a/c[../b]">
これはあなたが試していたものと似ています。
一致パターンで(つまり、述語の外で)直接使用できない理由..
は、パターンは見た目も動作も非常に似ているにもかかわらず、XPath式ではないためです。特に、「下向き」の軸(、、、child::
およびdescendant::
)attribute::
のみがパターンで直接許可されます。(仕様で許可されている唯一の明示的な軸はchild::
、パターンステップ間で暗黙的に許可されていattribute::
ます。Saxonはここでルールを少し曲げて、明示的な軸を許可しているようです。descendant::
//
descendant::
descendant-or-self::
軸の制限の理由は、(a)パターンで他の軸が必要になることはめったになく、(b)これにより、XSLTプロセッサーが一致のテストをはるかに効率的に行えるようになるためです。
ただし、パターンの述語は、XPath式と同じ構文規則で定義されます(変数参照やを許可しないなど、XSLT 1.0にはいくつかの制限がありますcurrent()
)。parent::
したがって、、、または略語などの他の軸を使用できます..
。
この XPath 式は機能しているようです (最適ではない可能性があります)。
//a|//c[following-sibling::b or preceding-sibling::b]
編集:
LarsH が正しい場合は、//a/c
代わりに//a|//c
.