2011-02-10 3 views
2

下記のxsltコードは、以下のXMLファイルでは機能しません。しかし、XMLファイル内の "objects"ノードから名前空間属性を削除すると、期待どおりに動作します。ルートノードに名前空間の属性があるときにxsltコードを修正するにはどうすればよいですか?最初の投稿、フォーマットがうまくいかない場合はごめんなさい。おかげネームスペースがルートノードで宣言されているときにxsltスクリプトが機能しない

XMLファイル:

<objects xmlns="http://www.spicefactory.org/parsley" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > 
<object id="models" type="blah"> 

</object> 
</objects> 

XSLTコード:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
<xsl:output method="xml" indent="no"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="object"> 
    <object new_attr="attr value "> 
    <xsl:apply-templates select="node()|@*"/> 
    </object> 
</xsl:template> 
</xsl:stylesheet> 
+0

[XSLTでの可能な重複デフォルトの名前空間がxmlnsに設定されているXMLソース](http://stackoverflow.com/questions/1344158/xslt-with-xml-source-that-has-a-default-namespac) e-set-to-xmlns) –

答えて

10

あなたのニーズを宣言し、XSLTで同じXML名前空間を使用します。

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

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

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

<xsl:template match="sfp:object"> 
    <sfp:object new_attr="attr value "> 
    <xsl:apply-templates select="node()|@*"/> 
    </sfp:object> 
</xsl:template> 
</xsl:stylesheet> 
+0

フィリップさん、ありがとうございました。私のXMLのデフォルトの名前空間と関係しています。デフォルト名前空間がxmlにある場合、私のxslt変換は機能しません。私のXMLからデフォルト名前空間が削除された場合、xslt変換が機能します。だから、私は私の変換作業を行うことができますし、XMLでデフォルトの名前空間を維持?ありがとう。 – dt1000

+0

これで、xmlからデフォルトのものと同じようにns caled sfpを作成し、それをスクリプトで明示的に使用したことが分かりました。それを修正しました、ありがとう! – dt1000

+0

@ user612275:あなたの質問がうまく答えられたら、あなたの感謝の気持ちを表現する最良の方法は、この答えを受け入れることです。これは、答えの横にあるチェックマークをクリックすることによって行われます。どうぞ、正しいことをしてください。 –

関連する問題