2012-05-02 2 views
1

私は、歌のタイトルと1位にランクされた週の数を表示するテキスト出力をしたいだけです。しかし、私はxsltでcountを使う方法を知らない。私のコードに何が間違っているかを誰かが助けてくれますか?私が今持っているコードには出力がありません。about xslt count()

<?xml version='1.0'?> 
<xsl:stylesheet 
    version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
<xsl:output encoding="UTF-8" omit-xml-declaration="yes" /> 
<xsl:template match="/"> 
    <xsl:for-each select="popular-recordings-dataset/recording"> 
    <xsl:sort select="count(//rank[. = '1'])" order="descending"/> 
    <xsl:value-of select="concat(title, '/', count(//rank[. = '1']),'&#xA;')" /> 
    </xsl:for-each>  
</xsl:template> 
</xsl:stylesheet> 
+0

サンプル入力と予想される出力を投稿できますか? –

答えて

1

この変換は:次のXML文書に適用さ

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

<xsl:template match="/*"> 
    <xsl:apply-templates select="recording"> 
    <xsl:sort select="count(week/rank[. = 1])" 
     data-type="number" order="descending"/> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="recording"> 
    <xsl:value-of select= 
    "concat(title, '/', count(week/rank[. = 1]), '&#xA;')"/> 
</xsl:template> 
</xsl:stylesheet> 

(何が問題に設けられていない!!!):

<popular-recordings-dataset> 
    <recording> 
    <title>Song1</title> 
    <week no="23"> 
    <rank>1</rank> 
    </week> 
    <week no="24"> 
    <rank>2</rank> 
    </week> 
    </recording> 
    <recording> 
    <title>Song2</title> 
    <week no="22"> 
    <rank>1</rank> 
    </week> 
    <week no="24"> 
    <rank>1</rank> 
    </week> 
    <week no="25"> 
    <rank>1</rank> 
    </week> 
    </recording> 
    <recording> 
    <title>Song3</title> 
    <week no="21"> 
    <rank>1</rank> 
    </week> 
    <week no="26"> 
    <rank>1</rank> 
    </week> 
    </recording> 
</popular-recordings-dataset> 

を望んでいた生産します、正しい結果

Song2/3 
Song3/2 
Song1/1 

説明:あなたのコードに問題がこの表現を使用している:

count(//rank[. = '1']) 

引数count()には、したがって、それはすべての選択、絶対 XPath式(/で始まる)でありますに等しい値を持つ文書内の要素はrankです。これは、この式が現在のrank要素に依存せず変化しないことを意味し、すべてのrank要素について同じままです。定数をソートしても、あなたが目にしたように、ノードセットの最初の順序は変更されません。

ソリューション

変更

count(//rank[. = '1']) 

count(.//rank[. = '1']) 

しかし、より良い、XML文書の構造が予め分かっている場合は、 //を使用しないでください。非常に非効率的な擬似オペレータである。