2011-08-07 1 views
2

xsltでhtmlページを作成して、xmlをHTMLページにフォーマットしていますが、値が繰り返されていますが、xsl、xml、htmlの理由はわかりません。私は私の繰り返し値がどこに直接現れるのかを示しました。ありがとうございました!XSLT予期しない繰り返しのテキスト

<fieldset> 
    <legend>Joys of a MAD man</legend><ol> 
      Joys of a MAD man *********** Why is the title repeated? ************ 
      <li>Slow Moving<a href="./Music/Splintz - Joys of a MAD Man/Slow Moving.mp3"> 
      [Download] 
      </a></li> 
</ol></fieldset> 

マイXML

<albums> 
    <album> 
     <title>Joys of a MAD man</title> 
     <track>Slow Moving</track> 
    </album> 
    <album> 
     <title>Single</title> 
     <track>None</track> 
    </album> 
</albums> 

し、最終的に私のXSL

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

    <xsl:template match="album"> 
     <fieldset> 
      <legend><xsl:value-of select="title/text()" /></legend> 
      <ol> 
       <xsl:apply-templates /> 
      </ol> 
     </fieldset> 
    </xsl:template> 

     <xsl:template match="track">   
      <li> 
       <xsl:value-of select="text()" /> 
       <a> 
        <xsl:attribute name="href"> 
        <xsl:text>./Music/Splintz - Joys of a MAD Man/</xsl:text> 
        <xsl:value-of select="text()"/> 
        <xsl:text>.mp3</xsl:text> 
       </xsl:attribute> 
       [Download] 
       </a> 
      </li> 
     </xsl:template> 
</xsl:stylesheet> 

答えて

2

結果ドキュメントにテキストをコピーするbuilt-in default template rulesがあります。

<xsl:apply-templates/>は、<xsl:apply-templates select="child::node()"/>の略です。

albumのテンプレートマッチ内にxsl:apply-templatesを使用しました。 album要素に「立っている」ときは、titleが処理される子ノードの1つです。

組み込みテンプレートtitleと一致すると、それはtext()「2人目の男の子」です。

titleテキストが2度目に出力されないようにするには、いくつかの方法があります。あなたは可能性:

  • が一致するから、内蔵のテンプレートを防ぐために、あなたのスタイルシートにtitleに一致する空のテンプレートを追加します。
    • <xsl:template match="title"/>
  • はあなたapply-templatesからtitleを除外する:
    • <xsl:apply-templates select="node()[not(self::title)]"/>
  • のみtrack子要素に、テンプレートを適用:
    • <xsl:apply-templates select="track"/>
1

あなたは上記のvalue-ofがそうであるように、あなたは同じコンテキスト名album<xsl:apply-templates />を適用しているため。すべての子孫からすべてのテキストノードを削除します。 明示的に<xsl:apply-templates match="track" />と言ってください。

+1

また、タイトル要素に空のテンプレートを追加する: '' – user268396

1

としては、他の人が指摘し、デフォルトのXSLT処理が実行するために、組み込みのXSLTテンプレートを選択して、これにより、テキストノードが出力されます。

コードがテキストノードのXSLTビルトインテンプレートに依存していないため、最も簡単な解決策は、このテンプレートを本文がないもので上書きすることです。

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:template match="album"> 
     <fieldset> 
      <legend> 
       <xsl:value-of select="title/text()" /> 
      </legend> 
      <ol> 
       <xsl:apply-templates /> 
      </ol> 
     </fieldset> 
    </xsl:template> 

    <xsl:template match="track"> 
     <li> 
      <xsl:value-of select="text()" /> 
      <a> 
       <xsl:attribute name="href"> 
        <xsl:text>./Music/Splintz - Joys of a MAD Man/</xsl:text> 
        <xsl:value-of select="text()"/> 
        <xsl:text>.mp3</xsl:text> 
       </xsl:attribute> 
        [Download]    
      </a> 
     </li> 
    </xsl:template> 

<xsl:template match="text()"/> 
</xsl:stylesheet> 

、その結果、不要な繰り返しテキストが含まれていません。今、あなたの完全なコードは、このになり

<xsl:template match="text()"/> 

はあなたのコードに以下を追加します。

<fieldset> 
    <legend>Joys of a MAD man</legend> 
    <ol> 
     <li>Slow Moving<a href="./Music/Splintz - Joys of a MAD Man/Slow Moving.mp3"> 
       [Download] 
      </a> 
     </li> 
    </ol> 
</fieldset> 
<fieldset> 
    <legend>Single</legend> 
    <ol> 
     <li>None<a href="./Music/Splintz - Joys of a MAD Man/None.mp3"> 
       [Download] 
      </a> 
     </li> 
    </ol> 
</fieldset> 
関連する問題