2011-07-11 17 views
0

私は単純なXMLファイルをXSLTで変換する必要があります。結果は元のXML入力ファイルと生成されたStringでなければなりません。文字列は、XMLファイルの値から生成されます。XSLTでドキュメントに新しい行を追加するには?

生成は簡単ですが、完全な元のXMLコンテンツを出力XMLに挿入するにはどうすればよいですか?

答えて

1

XSLT 1.0とXMLの完全なコピー。必要に応じて出力エンコーディング(このサンプルではUTF-8)とインデント(=はい)の必要性を変更します。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

<xsl:output method="xml" encoding="UTF-8" indent="yes"/> 

<xsl:strip-space elements="*"/> 

<!-- Default: copy everything --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

そして、あなたは最終用途でこれをテキストの1行を追加する場合:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

<xsl:output method="xml" encoding="UTF-8" indent="yes"/> 

<xsl:strip-space elements="*"/> 

<!-- add a line of text at the end of the xml --> 
<xsl:template match="/"> 
    <xsl:apply-templates/> 
    <xsl:text>your line of text</xsl:text> 
</xsl:template> 

<!-- Default: copy everything --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

(テキスト行で)最後の解決策は、有効なXMLを作成しないことに注意してください!

+0

ありがとう、私の場合私はその有効なXMLかどうか気にしない。私が理解していないのは、追加の行を作成する部分がコピー手順の前に呼び出される理由です。それはもう一方の方法でなければならないのでしょうか? – martin

+1

テンプレートは、対応するノードに一致します。あなたが最初に書くのは重要ではありません。ノード '/'はルートノードです(すべてのxmlにルートノードがあります)。このルートノードでは、すべての子と属性にテンプレートを適用します。属性と子は '@ * | node()'でテンプレートにマッチします。そして、このテンプレートはすべてをコピーし、一致するテンプレートをすべての属性とノードに再度適用します(したがって、それ自身を呼び出します)。 – therealmarv

0

copy-of要素は、基本ノードまたはxmlファイルのいずれかで直接使用することをお勧めします。例えば

、ここで <xsl:copy-of select="document('style.xml')/"/>

関連する問題