兄弟a/cを持つすべての要素を一致させようとしています。b私はもう試した:
<xsl:template match="a/b/../c">
しかし、Saxonから「式{..}をパターンに変換できません」というメッセージが表示されます。
私のXSLT/XPathスキルはせいぜい基本的なものです...
<xsl:template match="a[b]/c">
説明:子を持つ要素cの子であるすべての要素に一致します。ab
..また、述語で使用できる必要があります。
<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.