私がやろうとしていることを説明するのは少し難しいので、単純化しすぎた例を使用します。
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://MyNamespaceForB
Common.xslのように tns を宣言するとします。ここで、A.xsl を使用すると、tns 名前空間の値が競合します。その結果、Common.xsl によって生成された XML 要素には、明示的な名前空間の値http://MyNamespaceForB
. もちろん、それはうまくいきません。
私が何をしようとしているのか、ある程度明確になることを願っています。要するに、「呼び出し元」の xsl ファイルに、含まれている xsl ファイル内の名前空間の値を指定させたいと考えています。
何か案は?/フレドリック