Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > Выборка элементов по шаблону


Автор: artuska 12.4.2010, 17:07
Здравствуйте!

Есть XML с такой вот структурой:
Код

<suggestions>
 <item>here</item>
 <item>goes</item>
 <item>many</item>
 <item>words</item>
 <item>e.g.</item>
 <item>suggestions</item>
 <item>in</item>
 <item>english</item>
 <item>language</item>
 <item>one</item>
 <item>or many</item>
 <item>words</item>
 <item>in</item>
 <item>every</item>
 <item>tag</item>
</suggestions>


Это данные для подсказки в поле поиска (как в Гугле - вводишь слово, а под инпутом появляются возможные варианты того, что ты ищешь).
Так вот, как используя XSL выбрать все слова, начинающиеся на, например, букву 'o'?

На выходе должен быть вот такой HTML код:
Код

<ul>
 <li>one</li>
 <li>or many</li>
</ul>


Вот мой вариант:
Код

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:template match="/">
  <ul>

   <xsl:for-each select="suggestions[item='o*']"> // вот здесь не знаю, что вообще писать, чтобы выбрать слова на букву 'О'
    <li><xsl:value-of select="."/></li>
   </xsl:for-each>

  </ul>
 </xsl:template>
</xsl:stylesheet>


Или выборка по шаблону вообще по-другому делается?

Автор: diadiavova 12.4.2010, 22:12
Цитата(artuska @  12.4.2010,  18:07 Найти цитируемый пост)
 вот здесь не знаю, что вообще писать, чтобы выбрать слова на букву 'О'

Если дело в XPath выражении, то можно написать так
Код

  //suggestions/item[starts-with( text(), 'o')]

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

Автор: artuska 12.4.2010, 23:47
Цитата(diadiavova @  12.4.2010,  22:12 Найти цитируемый пост)
Только, честно говоря, не знаю чего ты этим добьёшься. Преобразование происходит один раз, когда документ запрашивается с сервера, а тебе надо, чтобы это происходило постоянно в интерактивном режиме.
Все эти возможности уже давно реализованы и не один раз в различных плагинах для яваскрипт-фреймворков, а xslt тут тебе не поможет. 

Вот, отлично, это то, что надо! Ну а что значит «что добьешься»? — пользователь вводит букву "А", посылается АЯКС запрос к ПХП файлу, который и оперирует XML'ом  и XSL'ом и возвращает готвый код подсказок.

Вопрос следующий — вот если пользователь ввел "А", то слова на букву "А" найдутся, а вот на букву "а" — нет. Как сделать, чтобы //suggestions/item[starts-with(text(), 'o')] не зависела от регистра, чтобы и маленькие и большие буквы искала?

UPD:
Хм, а где ты вычитал про функцию starts-with()? — http://www.w3schools.com/xsl/xsl_w3celementref.asp, например, в упор не вижу.

Автор: diadiavova 12.4.2010, 23:56
Цитата(artuska @  13.4.2010,  00:47 Найти цитируемый пост)
посылается АЯКС запрос к ПХП файлу, который и оперирует XML'ом  и XSL'ом и возвращает готвый код подсказок.

Можно, конечно, но чойт мне кажется это как-то  smile . Если на каждое изменение в текстбоксе будет посылаться запрос и выполняться такая сложная операция, это сервер не перегрузит? Всё-таки сервер не с одним пользователем работает.
Цитата(artuska @  13.4.2010,  00:47 Найти цитируемый пост)
 Как сделать, чтобы //suggestions/item[starts-with( text(), 'o')] не зависела от регистра, чтобы и маленькие и большие буквы искала?

Средствами xslt вроде никак, но раз это всё на пхп делается - переводи в нижний(или верхний) регистр на пхп и только потом посылай в обработку. 

Автор: artuska 13.4.2010, 00:03
Цитата(diadiavova @  12.4.2010,  23:56 Найти цитируемый пост)
Средствами xslt вроде никак

Жаль. Ну лана.

Вообщем, всё ок, diadiavova — спасибо!

Тему можно считать закрытой.

Автор: magelan 14.4.2010, 11:56
в XSL все можно... только это "дорогая" операция.


Код

<xsl:variable name="lower">abcdefghijklmopqrstuvwxyzабвгдежзийклмнопрстуфхцчшщэюя</xsl:variable>
<xsl:variable name="upper">ABCDEFGHIJKLMOPQRSTUVWXYZАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЭЮЯ</xsl:variable>

<xsl:for-each select="//suggestions/item[starts-with(translate(text(),$upper, $lower), 'o')]">
...


P.$. Господа, код привожу не для этой задачи, и не чтобы выпендриться, просто для общей инфы, проблема с регистрами достаточна частая при обработке.

P.P.$. Дядя Вова абсолютно прав, для этой задачи надо использовать что-то шустрее чем XSLT в идеале надо возвращать только данные для вывода:
Код

<suggestions>one;or many;оther</suggestions>

которые на клиенте разбираются в массив для вывода одним вызовом скриптовой функции .split(';');

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)