3

非常に複雑なXSLT1.0変換を行っています(現在、8つのXSLTパスを使用しています)。この8つのパスを1つのファイルにマージせずに結合したいと思います(これは複雑すぎます)。私の解決策は、パスを使用xsl:includeexsl:node-setてパスをマージし、一時的な結果を変数に格納することです。

しかし、私には1つの問題があります。私の変換パスは、ほとんどのノードをコピーし、特定の側面のみを変更します。したがって、すべてのパスで同じノードを処理する必要がありますが、異なる xsl:templateノードを使用します。しかし、どうすればそれを行うことができますか?最初のパスの後で、他のXSLTスタイルシートのテンプレートを適用したいことをどのように伝えますか?

私が現在行っていることの非常に単純化された例(2つのXSLTパス):

ソース:

<h>something here</h>

XSLTパス1の後:

<h someattribute="1">something here</h>

XSLTパス2の後:

<h someattribute="1" somemoreattribute="2">something here, and even more</h>

私の現在のアプローチは、XSLTプロセッサを2回呼び出し、結果を一時的にディスクに保存することです。

xsltproc stylesheet1.xsl input.xml >temp.xml
xsltproc stylesheet2.xsl temp.xml >finalresult.xml
4

2 に答える 2

2

考えられる解決策の 1 つは、各スタイルシートを個別のモードを使用するように変更することです。次に、それらすべてをマスター スタイルシートにインポートし、各モードを順番に使用してテンプレートを適用することで、複数のパスを実行できます。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:exsl="http://exslt.org/common"
                extension-element-prefixes="exsl"
                version="1.0">

  <xsl:import href="stylesheet1.xsl"/> <!-- assuming mode="stylesheet1" -->
  <xsl:import href="stylesheet2.xsl"/> <!-- assuming mode="stylesheet2" -->
  <xsl:import href="stylesheet3.xsl"/> <!-- assuming mode="stylesheet3" -->

  <xsl:template match="/">
    <xsl:variable name="temp1">
      <xsl:apply-templates select="." mode="stylesheet1"/>
    </xsl:variable>
    <xsl:variable name="temp2">
      <xsl:apply-templates mode="stylesheet2" select="exsl:node-set($temp1)"/>
    </xsl:variable>
    <xsl:apply-templates mode="stylesheet3" select="exsl:node-set($temp2)"/>
  </xsl:template>

</xsl:stylesheet>

欠点は、元のスタイルシートを変更して、それぞれに適切なmode属性を追加する必要があることです。それぞれのスタイルシートに次のような追加のテンプレートを追加することで、スタイルシートを独立して機能させることもできます。xsl:templatexsl:apply-templates

<xsl:template match="/">
  <xsl:apply-templates select="." mode="stylesheet1"/>
</xsl:template>
于 2011-07-21T20:49:23.810 に答える
0

使わない理由

<xsl:param name="iteration"/>

反復回数をスタイルシートに渡しますか? その後、このように使用できます

<xsl:if test="$iteration = 1">
  ...
</xsl:if>

...または他のコンテキストで

でパラメータを設定できます

javax.xml.transform.Transformer.setParameter("iteration", 1);

またはアリで:

<xslt ...>
  <param name="iteration" expression="1"/>
</xslt>
于 2011-07-21T09:29:27.933 に答える