xslt
  • xpath
  • 2013-10-31 2 views 1 likes 
    1

    나는 변수의 내용에 따라 정렬을 수행해야하는 상황이 있습니다.Else If Else sort XSLT1.0

    <xsl:sort select=" 
         if ($column = 'name') then name 
         else if ($column = 'score') then count(//scores/score[@id=current()/@id]) 
         else if ($column = 'rating) then count(//ratings/rating[@id=current()/@id]) 
         else name" 
         order={$sort}" /> 
    

    하지만 버전 1.0 할 필요가 내가 대안을 찾을 수 없습니다 :

    XSLT 2.0에서 내가 할. 어떻게해야합니까?

    답변

    3

    여러 종류의 키를 정의하고 그들 중 일부는 효과로 주선 할 수 있습니다 해당 정렬 키와 동일한 값)

    <xsl:sort select="name[$column = 'name']"/> 
    <xsl:sort select="count(/self::node() 
          [$column = 'score']/scores/score[@id=current()/@id])"/> 
    <xsl:sort select="count(/self::node() 
          [$column = 'rating']/ratings/rating[@id=current()/@id])"/> 
    <xsl:sort select="name"/> 
    
    +0

    매우 좋습니다. 그 "비효율적 인"종류는 전형적으로 O (1) 또는 O (N)일까요? – harpo

    +0

    대부분의 구현에서는 모든 요소의 모든 정렬 키를 평가하고 키를 비교하여 다른 키를 찾을 때까지 한 종류의 정렬 만 수행 할 것으로 기대합니다. 따라서 정렬 키를 2.0 솔루션에 비해 평가하고 비교하는 데는 추가 비용이 많이 들지만 확실히 높지는 않습니다. 괜찮은 프로세서는 성능이 O (N log N) 인 정렬을 갖습니다. –

    0

    XSLT 1.0에서 이러한 상황이 발생하면 xsl:choose을 사용합니다. 물론, 이는 차순위 인 정렬하려는 항목 (apply-templates 또는 for-each)을 반복해야한다는 것을 의미합니다.

    정말로 원하지 않는다면 정렬 키가 포함 된 노드 집합을 만들 수도 있습니다. 그것은 대부분의 구현에서 지원되는 node-set() 확장 기능을 필요로합니다 (어쨌든 사용했습니다).

    XPath 1.0에서 인라인 조건문을 수행하는 구문이 있습니다. this answer from Tomalak을 참조하십시오. 나는 이진 조건을 위해서조차도 그것을 직접 사용하지 않았으며 삼자 조건을 위해 그것을 사용한 사람에 대해서는 걱정할 것이다. 그러나 그것은 당신의 부름입니다.

    1

    이 확실히 못생긴이지만,보다 컴팩트 한 가지 방법 중 하나를 할 수있다하는 것은이 해내 : 모든 노드를 제공하여 (

    <xsl:key name="score" match="scores/score" use="@id" /> 
        <xsl:key name="rating" match="ratings/rating" use="@id" /> 
    
        <!-- ... --> 
    
        <xsl:variable name="useName" 
           select="$column != 'score' and $column != 'rating'" /> 
        <xsl:apply-templates select="something"> 
        <xsl:sort order="{$sort}" 
           data-type="{substring('numbertext', 1 + 6 * $useName, 6)}" 
           select="concat(
             substring(count(key('score', @id])), 1, 
                100 * ($column = 'score')), 
             substring(count(key('rating', @id])), 1, 
                100 * ($column = 'rating')), 
             substring(name, 1, 100 * $useName) 
            )" 
           /> 
        </xsl:apply-templates> 
    
    관련 문제