Сортировать разные элементы по одинаковым критериям - PullRequest
2 голосов
/ 13 января 2011

Я пытаюсь выполнить сортировку по следующим данным.

<contents>
   <content>
      <id>
      <text>
   </content>
   <relatedcontent>
      <id>
      <text>
   </relatedcontent>
</contents>

Это просто упрощенные примеры данных, но вы понимаете, как это сделать.Это два разных именованных узла, которые содержат одинаковую структуру.Прямо сейчас я создал два разных шаблона, чтобы обрабатывать контент и связанный контент отдельно, но затем сортировка также выполняется отдельно.Есть ли простой способ сортировки контента и связанного содержимого по идентификаторам?Допустим, <text> содержит текст.Как я мог тогда перечислить все <text> -элементы контента и связанного с ним контента, отсортированные по id?

Спасибо!

Ответы [ 2 ]

8 голосов
/ 13 января 2011

Попробуйте что-то вроде этого

<xsl:foreach select="//content | //relatedcontent">
  <xsl:sort select="id" />
  <xsl:value-of select="text" />
</xsl:foreach>

Я полагаю, что решение заключается в том, что вы "объединяете" //content и //relatedcontent в один набор узлов, используя оператор объединения |

7 голосов
/ 13 января 2011

Это преобразование показывает, как это можно сделать :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
  <contents>
   <xsl:apply-templates>
    <xsl:sort select="id" data-type="number"/>
   </xsl:apply-templates>
  </contents>
 </xsl:template>

 <xsl:template match="content">
   Content Here
 </xsl:template>

 <xsl:template match="relatedcontent">
   Relatedcontent Here
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML (исправлено, чтобы быть правильно сформированным):

<contents>
    <content>
        <id>3</id>
        <text/>
    </content>
    <relatedcontent>
        <id>2</id>
        <text/>
    </relatedcontent>
</contents>

желаемый, правильно отсортированный результат получается :

<contents>
   Relatedcontent Here

   Content Here
 </contents>

Примечание :

  1. Не использовать <xsl:for-each>. Используется только <xsl:apply-templates>.

  2. Не использовать оператор объединения XPath (да, он называется оператор объединения , не имеет отношения к каналам).

  3. Если в будущем в XML-документ будет добавлен третий элемент, который будет отсортирован по id, это преобразование все равно будет работать без каких-либо изменений.

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