Сортировка на основе существующих элементов в xslt - PullRequest
0 голосов
/ 03 июня 2010

Я хочу отсортировать в 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

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

Timber
Bryan
Ryan

(Также я не хочу потерять URL, привязанный к моим именам ранее при этом)

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

Мой 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 Ответ

1 голос
/ 03 июня 2010

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>

Я не уверен, что именно вы хотите отсортировать, но просто измените атрибут 'select' тега xsl: sort, чтобы указать ключ сортировки.

В качестве альтернативы, если вы пытаетесь форсировать определенный ордер, вы можете просто перебить его:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...