2012-05-02 3 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 값이 1 인 문서에있는 요소. 즉,이 표현식은 현재 rank 요소에 종속되거나 달라지지 않으며 모든 rank 요소에 대해 동일하게 유지됩니다. 상수를 정렬해도 목격 한대로 노드 집합의 초기 순서는 바뀌지 않습니다.

솔루션 :

변경 :

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

에 :

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

그러나 더 나은, XML 문서의 구조는 다음, 미리 알고있는 경우 //을 사용하지 마십시오. 의사 운영자는 매우 비효율적 일 수 있습니다.