この変換:
<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]), '
')"/>
</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 式 ( で始まる) であるため、値が に等しいドキュメント内の/
すべての要素を選択します。これは、この式が現在の要素に依存したり変化したりせず、すべての要素で同じままであることを意味します。定数でソートしても、ノードセットの初期順序は変更されません。これまで見てきたように。rank
1
rank
rank
解決策:
変更:
count(//rank[. = '1'])
に:
count(.//rank[. = '1'])
ただし、XML ドキュメントの構造が事前にわかっている場合は、//
非常に非効率的な疑似演算子の使用を避けるようにしてください。