XSLT - сортировка нескольких значений - PullRequest
1 голос
/ 03 октября 2009

Я уже создал свой XSLT, но id хотел бы иметь возможность сортировать данные, а также добавить какой-то индекс, чтобы я мог сгруппировать элементы вместе, сложность, с которой я столкнулся, - это узел, по которому я хочу отсортировать, содержит несколько значения - значения, по которым нужно сортировать.

Например, вот мой XML:

<item>
 <title>Item 1</title>
 <subjects>English,Maths,Science,</subjects>
 <description>Blah Blah Bah...</description>
</item>
<item>
 <title>Item 2</title>
 <subjects>Geography,Physical Education</subjects>
 <description>Blah Blah Bah...</description>
</item>
<item>
 <title>Item 3</title>
 <subjects>History, Technology</subjects>
 <description>Blah Blah Bah...</description>
</item>
<item>
 <title>Item 4</title>
 <subjects>Maths</subjects>
 <description>Blah Blah Bah...</description>
</item>

Так что, если я сортирую по <subjects>, я получу этот заказ:

English,Maths,Science,
Geography,Physical Education
History, Technology
Maths

Но я бы хотел получить такой вывод:

English
Geography
History
Maths
Maths
Physical Education
Science
Technology

Вывод XML для каждого предмета, содержащегося в <subjects>, поэтому Item1 содержит предметы по математике, английскому языку и естественным наукам, поэтому я хочу вывести этот заголовок и описание 3 раза, поскольку он относится ко всем 3 предметам.

Какой лучший способ сделать это в XSLT?

Ответы [ 2 ]

1 голос
/ 05 октября 2009

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

Далее вы должны пройти через этот новый набор узлов в порядке следования.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="urn:schemas-microsoft-com:xslt" extension-element-prefixes="exsl" version="1.0">

   <xsl:output method="text"/>

   <xsl:template match="/">
      <xsl:variable name="newitems">
         <xsl:for-each select="items/item">
            <xsl:call-template name="splititems">
               <xsl:with-param name="itemtext" select="subjects"/>
            </xsl:call-template>
         </xsl:for-each>
      </xsl:variable>
      <xsl:for-each select="exsl:node-set($newitems)/item">
         <xsl:sort select="text()"/>
         <xsl:value-of select="text()"/>
         <xsl:text> </xsl:text>
      </xsl:for-each>
   </xsl:template>

   <xsl:template name="splititems">
      <xsl:param name="itemtext"/>
      <xsl:choose>
         <xsl:when test="contains($itemtext, ',')">
            <item>
               <xsl:value-of select="substring-before($itemtext, ',')"/>
            </item>
            <xsl:call-template name="splititems">
               <xsl:with-param name="itemtext" select="substring-after($itemtext, ',')"/>
            </xsl:call-template>
         </xsl:when>
         <xsl:when test="string-length($itemtext) &gt; 0">
            <item>
               <xsl:value-of select="$itemtext"/>
            </item>
         </xsl:when>
      </xsl:choose>
   </xsl:template>

</xsl:stylesheet>

Обратите внимание, что в приведенном выше примере используются функции расширения Microsoft. В зависимости от того, какой процессор XSLT вы используете, вам может потребоваться указать другое пространство имен для процессора.

Вам также может понадобиться выполнить некоторое «обрезание» предметов, поскольку в приведенном выше примере XML есть пробел перед одним из предметов (Технология) в списке, разделенном запятыми.

1 голос
/ 04 октября 2009

Что ж, обработка содержимого текстовых узлов на самом деле не является задачей XSLT. Если вы можете, вы, вероятно, должны изменить представление, чтобы добавить еще немного XML-структуры в элементы предметов. В противном случае вам придется написать действительно умный код для обработки строк с использованием строковых функций XPath или, возможно, использовать процессор XSLT на основе Java и передать обработку строк методу Java. Это не просто.

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