XSLT を使用して、入力ドキュメントのプレフィックスではなく、スタイルシートの名前空間プレフィックスを使用する出力を取得する方法を考えています。例として、この非常に単純化されたドキュメントを考えると:
<?xml version="1.0"?>
<a:node xmlns:a="urn:schemas:blah:"/>
そして、次の XSL 変換:
<?xml version="1.0"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:blah="urn:schemas:blah:" version="2.0">
<xsl:output indent="yes">
<xsl:template match="/blah:node">
<xsl:copy/><!-- marked -->
</xsl:template>
</xsl:transform>
プロセッサー (重要な場合は Saxon8) は接頭辞「blah:」と「a:」の同等性を認識していることがわかりますが、たとえばfn:in-scope-prefixes()は「blah」を表示せず、「 a'. <!-- marked -->
上記の行を次のように変更します。
<node><xsl:value-of select="in-scope-prefixes(.)"/></node>
出力:
<?xml version="1.0" encoding="UTF-8"?>
<node xmlns:blah="urn:schemas:blah:">xml a</node>
入力ファイルがプレフィックス「a」を呼び出すことを事前に知らずに、入力プレフィックス「a」を「何とか」にマップするにはどうすればよいですか? (だから<xsl:namespace-alias/>
私にはうまくいきません。)
さらなる文脈として、より良い解決策を指し示す場合、これは外部で生成された XML ドキュメントを表示するためのものです。外部プロセスは、自動生成されたプレフィックス 'a:'、'b:'、'c:' などを使用して入力ドキュメントを作成します。これらのプレフィックスを、より使いやすい名前空間プレフィックスを使用して表示できるようにしたいと考えています。
更新: in-scope-prefixes() の動作は、静的に既知の名前空間の定義によって説明されています