2017-11-10 5 views
1

I以下のXML(ファイル:emcsh.xml):持って次の変換とは 'のxmlns = ""' せずにXMLのノード全体をコピーし

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<?xml-stylesheet type="text/xsl" href="tohtml.xsl"?> 
... 
<root> 
    <el> 
    <d>Some text with <kbd>code</kbd> and <em>prose</em>.</d> 
    </el> 
</root> 

(ファイル:tohtml.xsl):

<?xml version='1.0' encoding='utf-8'?> 
<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="http://www.w3.org/1999/xhtml"> 
... 
<xsl:template match="d"> 
    <xsl:copy-of select="node() | @*"/> 
</xsl:template> 
... 
<xsl:if test="d"> 
    <div class="tipper"> 
    <xsl:apply-templates select="d"/> 
    </div> 
</xsl:if> 
を結果の文字列がある

$ xsltproc tohtml.xsl emcsh.xml > emcsh.html && xmllint --format emcsh.html -o emcsh.html 

:次のパイプを使用してファイルを処理した後

... 
<div class="tipper"> 
    Some text with <kbd xmlns="">code</kbd> and <em xmlns="">prose</em>. 
</div> 
... 

ほとんど完全ですが、空の属性xmlns=""を使用しないで変換を実行するにはどうすればよいですか?

ありがとうございました。

+1

、我々は、入力とスタイルシート内の任意の名前空間宣言を参照する必要があります。 –

+0

一般に、 'xmlns =" "'これらの宣言は、ある名前空間の要素(入力から 'd'要素のようなもの)を特定の名前空間の要素に入れると起こります(' div'要素がいくつか名前空間はあなたが示していないスタイルシートの名前空間宣言によって)。名前空間を必要とせず、入力要素が名前空間にない場合、テンプレートがその名前空間を追加する必要がある場合、すべての要素を名前空間に入れないか特定の名前空間に入れるかを決定する必要があることを修正するには –

+0

@MartinHonnen改善された例。 –

答えて

1

これは、XSLTのデフォルト名前空間がhttp://www.w3.org/1999/xhtmlであり、リテラル要素(そこには<div>など)がその名前空間に存在するためです。

ヌル名前空間にある<kbd>をコピーすると、名前空間の変更を示すxmlns=""が挿入されます。

http://www.w3.org/1999/xhtmlの既定の名前空間を保持し、出力にxmlns=""がない唯一の方法は、XSLTに入力要素をhttp://www.w3.org/1999/xhtml名前空間に変換させることです。

あなたはこのようにそれを行うことができます。私たちは、問題を再現できるようにするために私たちに、最小限のが、完全なサンプルをご提示ください

<?xml version='1.0' encoding='utf-8'?> 
<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="http://www.w3.org/1999/xhtml"> 
... 
<xsl:template match="d"> 
    <xsl:apply-templates select="node() | @*"/> 
</xsl:template> 

<xsl:template match="d//*"> 
    <xsl:element name="{local-name()}" namespace="http://www.w3.org/1999/xhtml"> 
    <xsl:apply-templates select="node() | @*" /> 
    </xsl:element> 
</xsl:template> 
... 
<xsl:if test="d"> 
    <div class="tipper"> 
    <xsl:apply-templates select="d"/> 
    </div> 
</xsl:if> 
+0

良い答えをありがとう、しかし...なぜあなたはdownvoteでしたか? –

+0

@ReverendoAsperso私はあなたが不十分な情報を提供したと思っていました。申し訳ありません。私は今upvotedしました。今後の参考として、簡略化された例ではなく、問題を示す完全なXMLとXSLTを提供できる場合は最善です。詳細は、[mvce](https://stackoverflow.com/help/mcve)のページを参照してください。 – JLRishe

関連する問題