2015-08-04 2 views
0

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

Вот уместный раздел XSLT:

<xsl:template match="index"> 
<index><xsl:for-each select="indexitem"> 
<xsl:sort select="translate(name, '&lt;&quot;', '')"/> 
<xsl:sort select="searchscott" data-type="number"/> 
<indexitem> 
<xsl:apply-templates select="name"></xsl:apply-templates> 
<xsl:apply-templates select="scott"/> 
<xsl:apply-templates select="searchscott"/> 
<xsl:apply-templates select="searchterm"/> 
</indexitem></xsl:for-each></index> 
</xsl:template> 

Пример XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<index xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><indexitem> 
<name>3-Leaf Clover Snowflake</name> 
<scott>(4102)</scott> 
<searchscott>4102</searchscott> 
<searchterm>3-Leaf Clover Snowflake</searchterm></indexitem> 
<indexitem> 
<name>2004 Olympic Games Athens</name> 
<scott>(3863)</scott> 
<searchscott>3863</searchscott> 
<searchterm>2004 Olympic Games Athens</searchterm> 
</indexitem> 
<indexitem> 
<name>1943, Turning The Tide</name> 
<scott>(2765-)</scott> 
<searchscott>2765-</searchscott> 
<searchterm>1943: Turning The Tide</searchterm> 
</indexitem> 
<indexitem> 
<name>50s Sporty Cars</name> 
<scott>(3931-3935)</scott> 
<searchscott>3931-3935</searchscott> 
<searchterm>50s Sporty Cars</searchterm> 
</indexitem> 
<indexitem> 
<name>&lt;Valley of the Yosemite&gt;, by Albert Bierstadt</name> 
<scott>(4346)</scott> 
<searchscott>4346</searchscott> 
<searchterm>Albert Bierstadt, Valley of the Yosemite</searchterm> 
</indexitem> 
<indexitem> 
<name>13 - Star Flag over Independence Hall</name> 
<scott>(1622)</scott> 
<searchscott>1622</searchscott> 
<searchterm>13 - Star Flag over Independence Hall</searchterm> 
</indexitem> 
<indexitem> 
<name>1606 Voyage of Samuel de Champlain</name> 
<scott>(4073)</scott> 
<searchscott>4073</searchscott> 
<searchterm>1606 Voyage of Samuel de Champlain</searchterm> 
</indexitem> 
<indexitem> 
<name>Racing Car 1911</name> 
<scott>(2262)</scott> 
<searchscott>2262</searchscott> 
<searchterm>17.Racing Car 1911</searchterm> 
</indexitem> 
<indexitem> 
<name>Duryea, 1893</name> 
<scott>(3019)</scott> 
<searchscott>3019</searchscott> 
<searchterm>1893 Duryea</searchterm> 
</indexitem> 
</index> 

Am Я мечтал думать, что я могу получить меньшие цифры сортировать в первую очередь? Такие как:

<name>3-Leaf Clover Snowflake</name> 
<name>13 - Star Flag over Independence Hall</name> 
<name>50s Sporty Cars</name> 
<name>1606 Voyage of Samuel de Champlain</name> 
<name>2004 Olympic Games Athens</name> 

Или, это просто невозможно?

Благодаря

+0

Я бы подумал, что «мечтает» ожидать, что он будет работать так, как вы хотите, без усилий :) Возможно, вы сможете отделить главную часть числа от букв с использованием регулярного выражения в XSLT 2.0. – har07

+0

Какую версию XSLT вы используете? – har07

+0

Я могу использовать 1 или 2. Но большинство подпрограмм, которые мы используем, основаны на 1. –

ответ

0

Рассмотрим следующую настройку с помощью substring-before() и translate() попытке порезать имя в пространстве после чисел. Это лучшее, что я могу сделать. Попробуйте отредактировать документ или программный вывод xml для удаления дефис (то есть, 3-Leaf) и соединять буквы, как в (например, 50s).

Также обратите внимание, что процессор по-прежнему считает его строкой, отсортированной как таковой, а не числовой.

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

<xsl:template match="index"> 
    <index> 
    <xsl:for-each select="indexitem"> 
     <xsl:sort select="substring-before(translate(name, '-', ' '), ' ')"/> 

     <xsl:copy-of select="." /> 

    </xsl:for-each> 
    </index> 
</xsl:template> 

</xsl:stylesheet> 
+0

Я проверю его и посмотрю, работает ли он. благодаря –

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