xmlhack.ru XML-форумы
Обсуждение XML и связанных с ним технологий

Сортировка в случайном порядке


Автор Сообщение
Hrom
Новичок

Зарегистрирован: 08.07.2009
Сообщения: 4

[13895] Ср Июл 08, 2009 18:10
Сортировка в случайном порядке
Здравствуйте.
Имеется xml структура вида

<rows>
<row id="1" name="name1" />
<row id="2" name="name2" />
......
</rows>

Подскажите пожалуйста, как через XSLT трансформацию вывести эти поля в случайном порядке?
Vasilisk
Наставник

Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
[13896] Ср Июл 08, 2009 23:14

generate-id()?
_________________
С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]
Hrom
Новичок

Зарегистрирован: 08.07.2009
Сообщения: 4

[13897] Чт Июл 09, 2009 12:37

Vasilisk писал(а):

generate-id()?



Если вас не затруднит, можно пример кода?
Vasilisk
Наставник

Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
[13898] Чт Июл 09, 2009 23:57

Код:

<xsl:for-each select="......">
  <xsl:sort select="generate-id(.)"/>
  ..............
</xsl:for-each>


_________________
С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]
Hrom
Новичок

Зарегистрирован: 08.07.2009
Сообщения: 4

[13899] Пт Июл 10, 2009 01:28

Так я побывал. Не помогает(
aps
Новичок

Зарегистрирован: 10.07.2009
Сообщения: 4

Посетить сайт автора
[13902] Пт Июл 10, 2009 18:17

Никак. Но если установлены расширения типа, то можно.
Vasilisk
Наставник

Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
[13903] Пт Июл 10, 2009 21:17

Скажите, что вы подразумеваете под случайным порядком? То, что элементы после преобразования будут разбросаны в некотором порядке или то, что прти преобразовании одного и того же XML несколько раз мы получим разные последовательности?

Если первое, то подойдет любая хеш функция XSL, если второе - то Вам нужны расширения. Хотя бы JavaScript
_________________
С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]
Hrom
Новичок

Зарегистрирован: 08.07.2009
Сообщения: 4

[13904] Сб Июл 11, 2009 16:17

Видимо второе.

Скажем есть XML:

<root>
<foo>1</foo>
<foo>2</foo>
<foo>3</foo>
</root>

нужно, чтобы при каждом преобразовании было
123, 321, 132, 231....т.е. каждый раз в случайном порядке

Видимо нужно расширение. Подскажите пожалуйста, как это вообще делается или что гуглить? Я с XSLT очень мало сталкивался.
А смысл в том, что есть сайт. На PHP. С каталогом фирм. Движок построен на базе XSLT. Каталог изменяется редко и находится в XML кеше.
Нужно, чтобы при каждом заходе, фирмы перемешивались. Т.е. не было такого, что одна фирма всегда на верху или внизу.
Если бы XML генерировался каждый раз - не было бы проблем. Но дабы повысить производительности он естественно кешируется и смысл весь в том, что перемешать каталог посредством XSLT.
Vasilisk
Наставник

Зарегистрирован: 17.05.2006
Сообщения: 370
Откуда: Украина, Харьков
[13905] Сб Июл 11, 2009 20:59

Ищите XSLT extensions для своего парсера. Вот вам пример для MSXML

Код:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<Items>
  <item>1</item>
  <item>2</item>
  <item>3</item>
  <item>4</item>
  <item>5</item>
  <item>6</item>
  <item>7</item>
</Items>



Код:

<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:msxsl="urn:schemas-microsoft-com:xslt"
      xmlns:script="http://mycompany.com/mynamespace">

  <xsl:output method="html" indent="yes" encoding="windows-1251" />

  <msxsl:script language="JScript" implements-prefix="script">
    function rand() {
      return Math.random();
    }
  </msxsl:script>

  <xsl:template match="/Items">
    <html>
      <body>
        <xsl:apply-templates select="item">
          <xsl:sort select="script:rand()"/>
        </xsl:apply-templates>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="item">
    <xsl:value-of select="."/>
    <br/>
  </xsl:template>
</xsl:stylesheet>


_________________
С уважением Vasilisk
Уважайте читающих, используйте тэги [code ][/code]