4

兄弟a/cを持つすべての要素を一致させようとしています。b私はもう試した:

<xsl:template match="a/b/../c">

しかし、Saxonから「式{..}をパターンに変換できません」というメッセージが表示されます。

私のXSLT/XPathスキルはせいぜい基本的なものです...

4

2 に答える 2

5
<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::したがって、、、または略語などの他の軸を使用できます..

于 2012-08-07T19:55:43.633 に答える
1

この XPath 式は機能しているようです (最適ではない可能性があります)。

//a|//c[following-sibling::b or preceding-sibling::b]

編集:

LarsH が正しい場合は、//a/c代わりに//a|//c.

于 2012-08-07T18:12:19.597 に答える