XML で出力を生成する XSLT スタイルシートがあります。その出力を別のスタイルシートで処理したい。後者のスタイルシートに前者の結果を「実行して使用する」ように指示する方法はありますか?
2 に答える
私の知る限り、特定の入力に対して別のスタイルシートを実行し、出力に対して何かを行うように XSLT プロセッサに指示する標準的な方法はありません。場合によっては、1 つのテンプレート セットに対して入力を処理し、結果を変数に保存してから、次のように別のテンプレート セットを変数の値に適用できます。
<xsl:template match="/">
<xsl:variable name="temp">
<xsl:apply-templates mode="first-pass"/>
</xsl:variable>
<xsl:apply-templates select="$temp" mode="second-pass"/>
</xsl:template>
これは、XSLT 2.0 を実行していることを前提としています。XSLT 1.0 では、node-set 拡張機能をサポートするプロセッサが必要になり (多くの場合)、$temp への参照を exslt:nodeset($temp) のようなものに変更する必要があります。
お気づきのように、2 つのスタイルシートの両方がデフォルト モードを使用し、重複する要素タイプのセットを操作する場合、これはうまく機能しません。そのため、一部の XSLT プロセッサは拡張機能を追加して、説明した機能を提供しています (たとえば、Xalan pipe:pipeDocument 拡張要素の説明を参照してください)。
もちろん、XSLT の外でパイプを処理することもできます。最も簡単な方法は、実行している環境によって異なります。
オペレーティング システムのシェルから XSLT を実行していて、XSLT プロセッサが stdin で入力を受け入れる場合は、1 つのスタイルシートから別のスタイルシートに出力をパイプできます。
xsltproc a.xsl in.xml | xsltproc b.xsl - > out.xml
Mohammed moh がすでに指摘しているように、多くのスクリプト環境で同様のことが可能になっています。彼は PHP について言及しており、もちろん XProc もあります。
はい、できます。ソース ノードを DOMDocument I don't Know What is your Programming Language に変換する必要があります。たとえば、php の場合は、DOMDocument 出力で新しい XSLT スタイルシートを実行できる変換後のtransformToDoc()です。