0

apply-templates要素を使用して最初のXSL変換を行っています。XSLTを開発する場合、ベストプラクティスは何ですか?apply-templatesの選択、テンプレートの一致、または考慮していないものについて、非常に具体的にする必要がありますか?

例A

<xsl:template match="/">
    <xsl:apply-templates select="A/B/C/D"/>
    <xsl:apply-templates select="J/K/L/M"/>
    <xsl:apply-templates select="W/X/Y/Z"/>
</xsl:template>

<xsl:template match="Q"/>

また

例B

<xsl:template match="/">
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="A/B/C/D/Q or J/K/L/M/Q or W/X/Y/Z/Q"/>
4

2 に答える 2

1

提案された2つのフラグメントは非常に異なることを行うため、どちらが優れているかを判断するのは困難です。そのため、意図した結果が何であるかによって異なります。

<xsl:template match="A/B/C/D/Q or J/K/L/M/Q or W/X/Y/Z/Q"/>

構文エラーです

<xsl:template match="A/B/C/D/Q  | J/K/L/M/Q | W/X/Y/Z/Q"/>

またはおそらくより効率的です(ただし、一般的には同等ではありません)

<xsl:template match="Q"/>

したがって、エラーが修正されると、サンプルBは最初にツリーを詳細にウォークオーバーし、デフォルトのテンプレートをすべてのノードに適用します。特に、Q要素ノードに到達するまですべてのテキストを出力にコピーし、トラバーサルを削除してコピーしません。Qまたはその子孫を結果ツリーに追加します。

完全に対照的なサンプルAは、最初のドキュメント順序でツリーを完全にトラバースせず、最初にA/B/C/Dノードを処理します。特に、この段階で、またはこの段階で他の子を処理しないため、これらの子の子孫のテキストノードはコピーされません。出力。次に、Dから開始して深さ優先走査を開始し、前と同じように剪定します。その後、プロセスはで再開されるため、ソースで以前に発生した場合でも、からの出力はからの出力の後に出力されます。これは、結果の順序が入力の順序を反映しているサンプルとは対照的です。ABCQJ/K/L/M"MDMB

これはおそらく最小限の例のアーティファクトですが、入力が整形式のドキュメントである場合、サンプルAの3つの適用テンプレートのうち1つ/だけが結果を生成でき、1つの要素の子のみを持つことができるため、少なくとも2つはA J W何も選択しない必要があります。

于 2013-01-24T00:08:08.137 に答える
0

一般に、ソースドキュメントの構造が変更されても機能するスタイルシートを作成する場合は、ルールを一致パターンに配置することをお勧めします。select式を選択することは、ドキュメント以外の順序で子を処理する場合に主に役立ちます。

于 2013-01-24T11:13:14.463 に答える