2010-06-03 5 views
0

Я хочу сортировать в xslt на основе существующего набора шаблонов.Сортировка на основе существующих элементов в xslt

Позвольте мне объяснить, с кодом:

<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> 

Прямо сейчас я м просто называть его и получить его как (все гиперссылки)

Ryan 
Timber 
Bryan 

Теперь я не хочу сортировки по имени, но Я существующий шаблон, как я хочу, чтобы получить displayed.Like

Timber 
Bryan 
Ryan 

(Кроме того, я не хочу потерять URL прикрепленного к т y имена ранее при этом)

Я думал о том, чтобы поместить раннее значение в некоторый массив и сортировать на основе другого массива, где я буду хранить свой существующий шаблон. Но я не знаю, как добиться того, что ..

Мой XSLT выглядит как это сейчас (может быть повторяющихся имен также)

<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 1.0

ответ

1

XSLT 1.0 имеет возможность сортировки , Попробуйте экстраполировать этот пример:

<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> 

Делая это, однако, вы рискуете не хватают вещи, или в том числе вещи дважды. Порядок сортировки довольно гибкий, хотя, можно даже сортировать по

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

Это заявление будет возвращать 1 для «дерево», 8 для «Bryan» (длина «; Древесина;»), и 14 для «Ryan» (длина ', Timber; Bryan;'), и вы можете сортировать их, чтобы они отображались в том порядке, в котором вы хотите. Это решение поместило бы все, что вы не включили в свой порядок сортировки вверху, так как функция «substring-before» вернет пустую строку, которая, конечно, имеет длину 0. Вам нужно быть осторожным, однако, чтобы убедиться, что что вы не встретитесь преждевременно, если кто-то окажется подстрокой другого; например, если это все было в нижнем регистре, вы бы сравнили «ryan» слишком рано, так как он подхватил бы часть «bryan».

Смежные вопросы