2012-08-30 3 views
3

저는 XSL에 익숙하며 여기에있는 모든 예제를 살펴 보았지만 아무 문제가 없습니다.XSL 1.0 - 다른 목록의 목록 정렬

는 내가 그 정렬 순서 목록 및

<moviesList> 
<movie>movieA</movie> 
<movie>movieB</movie> 
<movie>movieC</movie> 
<movie>movieD</movie> 
<movie>movieE</movie> 
<movie>movieF</movie> 
<movie>movieG</movie> 
<movie>movieH</movie> 
</moviesList> 
내이 거대한 영화 목록의 종류에 정상을 먹고 싶어 지금 (왼쪽에서 오른쪽으로 순서) 영화의 정렬 순서 목록

<movies>movieF,movieC,movieG</movies> 

결과 내가 원하는 :

<moviesList> 
<movie>movieF</movie> 
<movie>movieC</movie> 
<movie>movieG</movie> 
<movie>movieA</movie> 
<movie>movieB</movie> 
<movie>movieD</movie> 
<movie>movieE</movie> 
<movie>movieH</movie> 
</moviesList> 

누군가가 나에게 달성하는 방법에 대한 몇 가지 지침을 제공하시기 바랍니다 것 그런 것. 변수 $ sortlist를 작성한 다음, 구분 된 문자를 추가하고 정렬에서 트릭을하기 전에 하위 문자열을 사용하려고했습니다. 결과는 내 정렬 목록이 영화의 나머지 부분보다 위에 표시되었지만 올바른 순서가 아님을 나타냅니다. 도와주세요.

답변

1

이 시도 :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:param name="sortlist" select="';movieF;movieC;movieG;'"/> 

    <xsl:template match="moviesList"> 
    <xsl:copy> 
     <xsl:for-each select="*[contains($sortlist, concat(';',.,';'))]"> 
     <xsl:sort select="substring-before($sortlist,concat(';',.,';'))" /> 
     <xsl:copy-of select="."/> 
     </xsl:for-each> 
     <xsl:copy-of select="*[not(contains($sortlist, concat(';',.,';')))]"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

공지 사항, 나는 정렬 string-length을 사용하지 않은, 그냥 문자열 자체를 사용했다. XSLT1.0은 숫자 대신 알파벳순으로 정렬 할 수 있습니다. 이는 숫자가 14보다 높기 때문에 결과적으로 movieF, movieG, movieC가됩니다.

실제로는 각 키 앞에 오는 영화 이름 목록의 일부를 정렬 키로 사용합니다. 알파벳순으로 ;movieF;;movieF;movieC; 앞에 오므로 정렬시 movieC 위는 movieG입니다.

필자는 개인적으로 '웅크리는 호랑이, 숨겨진 용'과 같은 일부 이름에서 쉼표를 구분 기호로 사용하지 않으려 고합니다. 세미콜론은 훨씬 적지 만 영화 이름에 나오는 문자가 아닌 한 원하는 문자를 사용할 수 있습니다.