2

私はコンテンツ タイプ固有の XSLT をいくつか持っていますが、これまでは互いに独立してしか使用されていませんでした。すなわち: content-type-A.xml=> content-type-A.xslt. ただし、最近の変更により、新しいドキュメントには複数のコンテンツ タイプからの集約コンテンツが含まれるため、それらを結合する必要があります。

主な問題は、コンテンツ タイプが要素名と属性名を共有しているため、コンテンツ タイプ固有の XSLT をマスター集約 XSLT に単純に含めることができないことです。それらを分離しておく最も簡単な方法は、XSLT の各テンプレートのコンテンツ タイプに対応するモードを適用することです。これには、何百ものテンプレートの更新と、XSLT の実行時にその初期モードを使用するために更新する必要があるワークフローの他の部分の依存関係が必要になります。

テンプレートのデフォルトモードを宣言する方法はありますか?または同等のものを達成するための回避策はありますか? 基本的に、テンプレートのモードを 1 回宣言すると、その後、指定されていない限りすべてのテンプレートがそのモードになり、指定されていない限り、適用されたすべてのテンプレートがそのモードになります。

4

3 に答える 3

1

以下をサポートする XSLT 3.0 準拠のプロセッサを使用しますdefault-mode

http://www.w3.org/TR/xslt-30/#default-mode

于 2013-11-06T21:19:53.417 に答える
1

XSLT を使用してモードを追加した XSLT を生成します (Dr. Kay の提案に従って)。これにより、スタイルシート変数として渡されたモードがデフォルト モードとして追加されますが、既存のモードは維持されます。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xso="dummy" version="2.0">
   <xsl:output method="xml" xml:space="preserve" indent="no" encoding="UTF-8" />
   <xsl:namespace-alias stylesheet-prefix="xso" result-prefix="xsl" />
   <xsl:param name="mode" required="yes" />
   <xsl:template match="xsl:template">
      <xso:template mode="{ (@mode, $mode)[1] }">
         <xsl:apply-templates select="@* except @mode|node()" />
      </xso:template>
   </xsl:template>
   <xsl:template match="xsl:apply-templates">
      <xso:apply-templates mode="{ (@mode, '#current')[1] }">
         <xsl:apply-templates select="@* except @mode|node()" />
      </xso:apply-templates>
   </xsl:template>
   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()" />
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>
于 2013-11-07T00:03:57.887 に答える