2010-06-03 7 views
0

기존 패턴 집합을 기반으로 xslt를 정렬하려고합니다. 지금 난 그냥를 호출처럼 점점 (모든 하이퍼 링크)xslt의 기존 요소를 기준으로 정렬

Ryan 
Timber 
Bryan 

가 지금은 이름을 정렬하지 않지만 있어요

<Types> 
    <Type> 
    <Names> 
     <Name>Ryan</Name> 
    </Names> 
     <Address>2344</Address> 
    </Type> 
    <Type> 
     <Names> 
     </Name>Timber</Name> 
     </Names> 
     <Address>1234</Address> 
    </Type> 
    <Type> 
     <Names> 
     </Name>Bryan</Name> 
     </Names> 
     <Address>34</Address> 
    </Type> 
</Types> 

:

나 코드로 설명하게 나는 그것이 표시되기를 바라는 방식을 기존 패턴으로 가지고 있습니다. 마찬가지로

Timber 
Bryan 
Ryan 

(또한 저는 m에 첨부 된 URL을 잃고 싶지 않습니다. y 이름을 일찍이 일을)

나는 이전 배열에 어떤 가치를 넣고 다른 배열을 기반으로 내 기존 패턴을 저장할 것이라고 생각했다. 그러나 나는 그것을 달성하는 방법을 잘 모르겠습니다 ..

내 XSLT는 XSLT 1.0 정렬 기능이 나는 XSL 1.0

답변

1

을 사용하고이 지금 (도있을 수 있습니다 중복 된 이름)

<xsl:for-each select="/Types/Type/Names/Name/text()[generate-id()=generate-id(key('Name',.)[1])]"> 
<xsl:call-template name="typename"> 
</xsl:call-template> 
</xsl:for-each> 

<xsl:template name="typename"> 

<li> 
<a href="somelogicforurl"> <xsl:value-of select="."/> </a> 
</li> 

</xsl:template> 

처럼 보인다 . 내가 정확히에 정렬 할 모르겠어요

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="Types"> 
    <xsl:element name="SortedList"> 
     <xsl:for-each select="Type"> 
     <xsl:sort select="Names/Name" /> 
     <xsl:element name="a"> 
      <xsl:attribute name="href">link</xsl:attribute> 
      <xsl:value-of select="Names/Name" /> 
     </xsl:element> 
     </xsl:for-each> 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

있었으나 결국 XSL의 '선택'속성 변경 :이 예를 외삽 시도 정렬 키를 지정 정렬 태그를.

또는 특정 순서를 강제하려는 경우, 당신은 할 수 단지 폭력을 :

<xsl:template match="Types"> 
    <xsl:element name="SortedList"> 
     <xsl:apply-templates select="Names[Name='Timber']" /> 
     <xsl:apply-templates select="Names[Name='Bryan']" /> 
     <xsl:apply-templates select="Names[Name='Ryan']" /> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="Names"> 
    <xsl:element name="a"> 
     <xsl:attribute name="href">link</xsl:attribute> 
     <xsl:value-of select="Name" /> 
    </xsl:element> 
    </xsl:template> 

그러나 이렇게함으로써, 당신은 일을 놓치고, 또는 두 가지를 포함하여 위험이 있습니다. '라이언'에 대한 ('; 목재'의 길이), 14 상당히 유연하지만 정렬 순서의, 당신은 심지어 종류에

<xsl:sort select="string-length(substring-before(';Timber;Bryan;Ryan',Names/Name))" /> 

이 문장은 '브라이언'에 대한 '목재', 8 일을 반환합니다 수 (길이 '; 목재; 브라이언;'), 이것을 정렬하여 원하는 순서대로 표시되도록 할 수 있습니다. 이 솔루션은 'substring-before'함수가 길이가 0 인 빈 문자열을 반환하기 때문에 상단에 정렬 순서에 포함시키지 않은 것을 넣을 것입니다. 물론주의해야합니다. 하나가 다른 사람의 부분 문자열 일 때 조기에 일치하지 않는다는 것; 예를 들어 이것이 모두 소문자 인 경우 'ryan'을 'bryan'의 일부로 인식하기에 너무 일찍 일치시킵니다.

관련 문제