1

私がやろうとしていることを説明するのは少し難しいので、単純化しすぎた例を使用します。

A.xsl、B.xsl、および Common.xsl の 3 つの Xsl テンプレートがあります。

A.xsl と B.xsl はどちらも「xsl:include」を使用して Common.xsl をインクルードします。A.xsl は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tns="http://MyNamespaceForA" >
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:include href="Common.xslt"/>
    <xsl:template match="/">
        <tns:RootA>
            <xsl:apply-templates select="Root" />
        </tns:RootA>
    </xsl:template>
</xsl:stylesheet>

B.xls は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tns="http://MyNamespaceForB" >
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:include href="Common.xslt"/>
    <xsl:template match="/">
        <tns:RootB>
            <xsl:apply-templates select="Root" />
        </tns:RootB>
    </xsl:template>
</xsl:stylesheet>

最後に、Common.xls は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  >
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="Root">
        <tns:Element>
            <tns:SubElement>
            </tns:SubElement>
        </tns:Element>
    </xsl:template>
</xsl:stylesheet>

したがって、A と B は異なって見え、同じ名前空間プレフィックス (tns) を使用しますが、名前空間の値は異なります。A と B には、tns 名前空間も使用する Common.xsl が含まれています。

言い換えれば、Common.xsl の tns 名前空間が「呼び出し元」、つまり A または B の xsl ファイルの値を取得するようにします。

ただし、これは XslCompiledTransform を使用している場合は機能しません。Common.xsl では、tns が宣言されていない名前空間であると不平を言っています。Common.xsl で tns 名前空間を宣言する場合は、 または のいずれhttp://MyNamespaceForAかを使用する必要がありますhttp://MyNamespaceForB

http://MyNamespaceForBCommon.xslのように tns を宣言するとします。ここで、A.xsl を使用すると、tns 名前空間の値が競合します。その結果、Common.xsl によって生成された XML 要素には、明示的な名前空間の値http://MyNamespaceForB. もちろん、それはうまくいきません。

私が何をしようとしているのか、ある程度明確になることを願っています。要するに、「呼び出し元」の xsl ファイルに、含まれている xsl ファイル内の名前空間の値を指定させたいと考えています。

何か案は?/フレドリック

4

1 に答える 1

1

Common.xslt で直接名前空間を使用する場合は、同じファイルで名前空間を宣言する必要があります。そうしないと、有効な XML にならず、XSLT プロセッサがそれを読み込めません。

解決策はxsl:element、要素を作成し、ターゲット名前空間の変数を使用することです

A.xslt :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" indent="yes"/>

  <xsl:variable name="targetNS" select="'http://MyNamespaceForA'"/>

  <xsl:include href="common.xslt"/>

  <xsl:template match="/">
    <xsl:element name="RootA" namespace="{$targetNS}">
      <xsl:apply-templates select="Root"/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

Common.xslt:

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="Root">
    <xsl:element name="Element" namespace="{$targetNS}">
      <xsl:element name="SubElement" namespace="{$targetNS}">
      </xsl:element>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>
于 2012-05-30T18:14:36.950 に答える