1

単純に、曲のタイトルと 1 位にランクされた週数を示すテキスト出力が必要です。しかし、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>
4

1 に答える 1

1

この変換:

<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>

次のXMLドキュメントに適用した場合(質問には何も提供されていません!!!):

<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 式 ( で始まる) であるため、値が に等しいドキュメント内の/すべての要素を選択します。これは、この式が現在の要素に依存したり変化したりせず、すべての要素で同じままであることを意味します。定数でソートしても、ノードセットの初期順序は変更されません。これまで見てきたように。rank1rankrank

解決策:

変更:

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

:

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

ただし、XML ドキュメントの構造が事前にわかっている場合は、//非常に非効率的な疑似演算子の使用を避けるようにしてください。

于 2012-05-02T04:28:52.223 に答える