2012-02-20 9 views
0

現在、XML文書を新しい文書にコピーして、いくつかのノードの名前を変更しようとしています。XML固有のノードテンプレートが一致しません

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

と私の特定のテンプレートが(下記のために適合される):私の問題は、しかし、私のテンプレートがヒットし、唯一のグローバル1がされていないことである

<xsl:template match="F"> 
    <G> 
     <xsl:apply-templates/> 
    </G> 
    </xsl:template> 

XML構造は、これに似ていますしかしによる作業:)

<T> 
<A> 
    <B> 
    </B> 
    <C> 
    </C> 
</A> 
<D> 
    <E>Data</E> 
    <F>Data</F> 
</D> 
</T> 

VS2010でこれを実行して、私はそれがXMLでFのラインを打つ見ることができますが、まだ一般的なテンプレートではなく、MOを適用しているの性質に適応特定のもの。なぜこのようなアイデアですか?

答えて

0

このOPは、XML文書に関する最も重要な事実をconceiledた - 彼は後にコメントで教えてくれるよう、「XMLが名前空間を使用しています」...ここで

がソリューションですこのように、後半に明らかになっ質問へ:

この変換は、次のXML文書に適用され
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:x="some:namespace" xmlns="some:namespace" 
exclude-result-prefixes="x"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="x:F"> 
    <G> 
     <xsl:apply-templates/> 
    </G> 
</xsl:template> 
</xsl:stylesheet> 

(名前空間に基づく入院OP ...) :

<T xmlns="some:namespace"> 
    <A> 
     <B> </B> 
     <C> </C> 
    </A> 
    <D> 
     <E>Data</E> 
     <F>Data</F> 
    </D> 
</T> 

指名手配、正しい結果がが生成されます

<T xmlns="some:namespace"> 
    <A> 
     <B /> 
     <C /> 
    </A> 
    <D> 
     <E>Data</E> 
     <G>Data</G> 
    </D> 
</T> 

説明

元のコードに問題はここにある:

<xsl:template match="F"> 

このテンプレートeは、名前空間にない要素Fと一致します。しかし、実際のXML文書のすべての要素は、名前空間にない非公開の名前空間にあります。したがって、上記のテンプレートは、名前空間のない要素(Fの名前空間が存在しないため)が存在しないため、F要素を名前空間に一致させることはできません。

溶液は、XSLT変換に同じ名前空間を定義し、テンプレートは、その名前空間内のF要素と一致させることです。

+0

細部を省略して謝罪しますが、XSLの経験は些細なものです。しかしそれは問題を解決しました。 – Mike

+0

@Mike:詳細は重要です。それ以外の場合は、悪天候の問題を説明することができます。 –

0

は私のために正常に動作するようです。私は、次のスタイルシートを使用:

<?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="/"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="F"> 
    <G> 
     <xsl:apply-templates/> 
    </G> 
</xsl:template> 
</xsl:stylesheet> 

をして、XMLコードでそれを実行した、以下を返す:

<?xml version="1.0" encoding="UTF-8"?> 
<T> 
<A> 
    <B> 
</B> 
    <C> 
</C> 
</A> 
<D> 
    <E>Data</E> 
    <G>Data</G> 
</D> 

あなたが望む結果のように見えるWhicj。だから、あなたはどこがうまくいかないかについて少し詳しく知ることができますか?

+0

VS2010でブレークポイントを使用してXSLTを実行すると、探しているノードに到達し、既定のテンプレートで読み込まれます。あなたのテンプレートにもコピーされ、同じ問題を受け取ってみました。 XMLは名前空間を使用しますが、これはプロセスに何らかの影響を及ぼしますか?私はxsltでxsltと同じように宣言していますので、それはそうだとは思わないでしょう – Mike

+0

@Mike:あなたは私たちから最も重要な情報の1つを隠しています - ノードは名前空間にあります(デフォルト?)。このためにさえ、あなたはdownvote(ちょうど言っている)に値する。質問を編集し、実際のXML文書を提供してください。そうすれば、人々は問題を自分自身で再現することができます! –

+0

デフォルトの名前空間ではなく、実際のデータを仕事に関連して秘密にすることができないため、これに対応することが難しいことは明らかです。あなたがサイトへの素晴らしい歓迎を必要と感じる場合は、私にdownvoteを自由に感じてください:)それはおそらくネームスペースが問題を引き起こしているのでしょうか? – Mike

関連する問題