2011-01-04 7 views
0

私のXMLは、今私は、次のようにXSLTの助けを借りて、上記のXMLファイルを使用して別のXMLドキュメントを生成する(出力形式)そのために私のxsltは正しい出力を生成しませんか?

 <?xml version="1.0" encoding="ISO-8859-1"?> 
     <catalog> 
     <cd> 
     <title>Empire Burlesque</title> 
     <artist>Bob Dylan</artist> 
     </cd> 
     <cd> 
     <title>Hide your heart</title> 
     <artist>Bonnie Tyler</artist> 
     </cd> 
      </catalog> 

'input.xsl'

 <?xml version="1.0" encoding="ISO-8859-1"?> 
    <?xml-stylesheet type="text/xsl" href="input.xsl"?> 
     <catalog> 
    <cd> 
    <title>Empire Burlesque</title> 
    <artist>Bob Dylan</artist> 
    <country>USA</country> 
    <company>Columbia</company> 
    <price>10.90</price> 
    <year>1985</year> 
    </cd> 
    <cd> 
    <title>Hide your heart</title> 
    <artist>Bonnie Tyler</artist> 
    <country>UK</country> 
    <company>CBS Records</company> 
    <price>9.90</price> 
    <year>1988</year> 
    </cd> 
     </catalog> 

です私はxslファイル 'input.xsl'を作成します。

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

    <xsl:template match="/"> 
     <xsl:element name="catalog"> 
      <xsl:apply-templates select="catalog/cd/title"/> <br/> 
      <xsl:apply-templates select="catalog/cd/artist"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="catalog/cd/artist"> 
     <xsl:element name="cd"> 
      <xsl:value-of select="current()"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="catalog/cd/title"> 
     <xsl:element name="cd"> 
      <xsl:value-of select="current()"/> 
     </xsl:element> 
    </xsl:template> 
    </xsl:stylesheet> 

上記のxslファイルは、xml形式の出力を生成しません。だから私のコードの問題です。教えて。前もって感謝します。

答えて

1

呼び出しの選択句で、一致させる予定のパスを使用しています。それぞれのノードが一致すると、現在のノードになり、それ以降の相対XPath式が評価されます。また、常に要素を構築する必要はありません。必要な場所に「定型句」のXMLを配置するだけです。

私が代わりにお勧め:テキスト場合

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

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

<xsl:template match="artist"> 
    <artist><xsl:value-of select="text()" /></artist> 
</xsl:template> 

<xsl:template match="title"> 
    <title><xsl:value-of select="text()" /></title> 
</xsl:template> 

は、私は(覚えていないこと)が正しいことであるが、それは、あなたは正しい方向に向かってしまうかもしれません。

+0

1は、はい、私は、これは便利な方法で現在のノードの概念を説明すると思います – PandaWood

+0

テキストのためのビルトインルールは、文字列の出力ノード値。つまり、すべてのルールは同じルールです。 'です。しかし、要素の組み込み規則(この場合、 'title'や' artist'以外の 'cd'Chlidren)は子にテンプレートを適用するので、ストリッピング規則を追加する必要があります。 –

1

実際、私はあなたがテンプレートマッチングのすべてを必要とするとは思わなかった。状況が毎回異なるため、難しいようです。

私はちょうどルートと一致し、cd要素のfor-eachを実行します。 はそんなに単純なようだ、私はあなたがアイデンティティがパターンに変換悪用、それを;-)

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

    <xsl:template match="/"> 
     <catalog> 
      <xsl:for-each select="catalog/cd"> 
       <cd> 
        <title><xsl:value-of select="title"/></title> 
        <artist><xsl:value-of select="artist"/></artist> 
       </cd> 
      </xsl:for-each> 
     </catalog> 
    </xsl:template> 
</xsl:stylesheet> 
+0

そして、もしこの道を辿るなら、最良の答えは '' –

1

別のアプローチを読んでからちょうど理解すると思います。サンプルのXMLに適用

<?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" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="country | company | price | year | processing-instruction()"/> 

</xsl:stylesheet> 

、正しい結果が生成されます。

<?xml version="1.0" encoding="UTF-8"?> 
<catalog> 
    <cd> 
     <title>Empire Burlesque</title> 
     <artist>Bob Dylan</artist> 
    </cd> 
    <cd> 
     <title>Hide your heart</title> 
     <artist>Bonnie Tyler</artist> 
    </cd> 
</catalog> 
+0

+1です。 –

+0

しかしPIは削除する必要はありません。存在しません。もしそうなら、おそらくコメントノードも削除するべきでしょうか? –

+0

@Dimitre、xml-stylesheet type = "text/xsl" href = "input.xsl"です。 – Flack