2010-12-08 10 views
2

XMLからカテゴリ値だけを返すようにXSLTを取得するのに問題があります。 lastupdateとパスが返されるのはなぜですか? ...どうすればこれをやめることができますか?前もって感謝します。XSLT明示的なノード選択で何も返さない

XMLドキュメント

<?xml version="1.0"?> 
<categories count="3"> 
    <lastupdate>08/12/2010 12:27</lastupdate> 
    <path>C:\</path> 
    <category>Music</category> 
    <category>News</category> 
    <category>Sport</category> 
</categories> 

マイXSLT

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="categories"> 
     <html> 
      <body> 
       <table border="0" cellpadding="0" cellspacing="0"> 
        <tbody> 
         <tr> 
          <td> 
           <xsl:apply-templates/> 
          </td> 
         </tr> 
        </tbody> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="category"> 
     <a> 
      <xsl:value-of select="." /> 
     </a> 
    </xsl:template> 
</xsl:stylesheet> 

出力HTML

<html> 
    <body> 
     <table border="0" cellpadding="0" cellspacing="0"> 
      <tbody> 
       <tr> 
        <td>08/12/2010 12:27C:\ 
         <a>Music</a> 
         <a>News</a> 
         <a>Sport</a> 
        </td> 
       </tr> 
      </tbody> 
     </table> 
    </body> 
</html> 
+0

あなたの出力は、これはyour'reが実行されているフルXSLTはないことを示唆している参照してくださいhttp://www.w3.org/TR/xslt#built-in-rule

は、このように次のコードが必要です。私はあなたの出力に 'lastupdate'と' path'をコピーするあなたのxsltに何かがあると思っています。 – Filburt

+0

私は同意します。テーブルはどこから来たのですか?投稿されたコードからは分かりません –

+0

サンプルのインデントから判断すると、本文とapply-templatesの間のテーブルは除外され、出力も説明されます。 – TToni

答えて

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="html" indent="yes" omit-xml-declaration="yes"/> 
    <xsl:template match="categories"> 
     <html> 
      <body> 
       <xsl:apply-templates select="category"/> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="category"> 
     <a> 
      <xsl:value-of select="." /> 
     </a> 
    </xsl:template> 
</xsl:stylesheet> 

は希望出力に含まを取得するには:

<html> 
    <body> 
     <a>Music</a> 
     <a>News</a> 
     <a>Sport</a> 
    </body> 
</html> 
1

あなた<のxsl:適用-テンプレート/>すべてのサブノードに一致するすべてのテンプレートを適用します。

lastupdateとpathに一致するテンプレートが定義されていないため、XSLTはデフォルトテンプレートを適用します。この場合、テキストコンテンツがコピーされます。

これを無効にするには、デフォルトのテンプレートをオーバーライドするか(通常はそれほどうまくいかない)、処理したいノードでテンプレートアプリケーションを制限する必要があります。

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

あなたはこれらの値になってしまう理由は説明するだろう:あなたの例では、それはあなたがあなたのXSLTの下部に、このどこかのようなものを持っていることだろう

<xsl:apply-templates select="./category"/> 
+0

あなたは*既定のテンプレートを上書きしています(通常はあまり良くありません)*。これは間違っています:ほとんどすべての変換はいくつかの組み込みルールを上書きします...また、 '。/'ステップの開始は冗長であり、必要ではありません。 –

+0

@Alejandro:通常のテンプレートは、ノードの特定のサブセットにのみ適用される特定のルールを持つ一般(デフォルト)ルールをオーバーライドします。それは完全にOKです。デフォルトのルールを同じスコープに適用するルールに置き換えることは、私の経験ではほとんど必要ありません。 OPがXSLTであまり経験していないようだから、 "./"をつけてxpath-statementであることを示しました。 – TToni

+0

インデントルール(頻繁に使用されるインデントルール)は、組み込みルールの属性を上書きします。 –

0

に適用さ-テンプレートを展開しますあなたの出力の真ん中のどこかで。

+0

XSLTは、ノード、属性、テキストノードのデフォルトのテンプレートを定義しています。ここでは、一般的な呼び出しを使用しています。彼らは上書きされるまで常にそこにいます。彼のサンプルにXSLTをXMLに適用すると、説明された出力(不足しているテーブルタグとは別に) – TToni

3

なぜlastupdateとパスが で返されますか?

正確これら二つ、built-in rulesため:

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

<xsl:template match="text()|@*"> 
    <xsl:value-of select="."/> 
</xsl:template> 

apply-templatesselect="node()"を有する同じです。次に、lastupdatepathの要素は、要素の組み込みルール(子ノードにテンプレートを適用するだけ)と一致し、テキストノードはテキストノードの組み込みルール(出力文字列値)と一致します。

...どうすればいいですか?

上書きのようなルールに建ての1:なしテキストノードの出力を意味しない

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

。それとも、すべてのcategories「子要素ノードにテンプレートを適用しているあなたのコードでは

<xsl:template match="categories"> 
<html> 
    <body> 
    <xsl:apply-templates select="category"/> 
    </body> 
</html> 
</xsl:template> 
+0

+1がコアテククト(およびベストアンサー)になります。 –

関連する問題