|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
Привет гениальным парням! ) есть такой XML - список товаров с вложенными вариантами товаров, у товара может быть несколько вариантов. И у материнского товара и дочернего(вариант, модификация) - есть поле таймера ------------------------------------------------- <item> <datetime> <item> <datetime> <item> <datetime>07.08.2014 10:11:59</datetime> <modifications> <item> <datetime>07.08.2014 10:14:29</datetime> <item> <datetime ....> <item> <datetime.....> </modifications> <item> <datetime> <item> <datetime> ---------------------------------------------------- возможно ли средствами XSL отсортировать все товары Item таким образом, чтобы: если попадается товар с вложенными модификациями, то в качестве ключа сортировки datetime материнского товара подставлялся datetime самого свежего вложенного товара (модификации)? я много чего перепробовал, уже чувствую тупик. Может быть есть идея? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 15:34 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
обалденный xml. угадай, где должен быть закрывающий тэг. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 16:17 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
даже если так Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
все равно бардак ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 16:20 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
оригинальный xml чрезмерно большой, там десятки полей и атрибутов, я взял основное, ну ведь очевидно же: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 16:59 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
2-х уровневое дерево - список items, но у некоторых item есть вложенный список modifications. 1-й уровень item/datetime 2-й уровень item/modifications/item/datetime Сейчас сортировка работает по item/datetime, Задача: Если <xsl:when test="count(modifications/item) > 0"> то вместо ключа item/datetime выдать что-то типа last(item/modifications/item/datetime) <xsl:otherwise> ключ сортировки тот-же - item/datetim поле datetime - это как пример, вместо него можно и по параметру ID, но построить такой принцип сортировки я не смог найти имеющимися средствами xPath и собственно XSL ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 17:11 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
Нужно создать промежуточный xml Код: xml 1. 2. 3.
и отсортировать по item/@datetime ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 17:22 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
Antonariy, это HostCMS, там нет возможности в кишках ковыряться, я могу разве что дополнительным параметром в динамической php-странице запросить дополнительные поля из базы, которые появятся в XML ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 17:25 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
в таблице товаров у каждой модификации есть заполненное поле с ID-материнского товара, я могу его добавить в XML, но я не представляю как это может помочь ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 17:29 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
Промежуточный xml создается в самом xsl: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 17:32 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
ага, Спасибо за идею! нечто новое для меня, надо обмозговать, спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2014, 17:41 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
А что, конструкция <xsl:for-each select="msxsl:node-set($tmp)"> </xsl:for-each> должна работать вместо <xsl:apply-templates select="item" > </xsl:apply-templates > ? а может быть такое что такая Функция может не поддерживаться процессором? у меня libxml2-2.9.1_1 XML parser library for GNOME libxslt-1.1.28_3 The XSLT C library for GNOME ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2014, 16:54 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
это не работает: Код: plaintext 1. 2. 3.
меня смущает msxlt, от него майкрософтом пахнет) , мож. быть несовместимость с процессором? попробовал вывести посмотреть на содержимое этой функции через value-of, тоже ничего не видно как только ставлю на место Код: plaintext 1. 2. 3. 4.
сразу все работает, что не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2014, 19:10 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
Валерьянкаменя смущает msxlt, от него майкрософтом пахнет) , мож. быть несовместимость с процессором?В понедельник покажу код для всех процессоров ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2014, 19:21 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
_Vasilisk_ , обещал код показать ) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2014, 18:06 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
Валерьянка_Vasilisk_ , обещал код показать )Точно. Забыл. Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Теперь при вызове Код: xml 1.
трансформер от Microsoft будет вызывать свою функцию, а всякие Xalan и Saxon будут вызывать пользовательскую функцию, которая внутри вызывает их родную common:node-set(). Если же совместимость с Microsoft не нужна, то достаточно просто в коде сразу дергать common:node-set() и свою функцию не определять ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2014, 19:51 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
ааа, так для использования функций от microsoft просто нужно было сначала объявить о них в <xsl:stylesheet прописью xmlns:msxsl="urn:schemas-microsoft-com:xslt? это главная идея, да? и процессор будет их адекватно парсить? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2014, 18:50 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
Валерьянкаааа, так для использования функций от microsoft просто нужно было сначала объявить о них в <xsl:stylesheet прописью xmlns:msxsl="urn:schemas-microsoft-com:xslt? это главная идея, да? и процессор будет их адекватно парсить?я что-то сомневаюсь, но ведь попытка не пытка же? всего-то xmlns:msxsl дописать. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2014, 19:01 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
Не идет внедрение новых технологий (( <xsl:template match="item"> <item> <xsl:attribute name="datetime"> <xsl:choose> <xsl:when test="count(modifications/item) > 0"> <xsl:value-of select="modifications/item[1]/datetime"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="datetime"/> </xsl:otherwise> </xsl:choose> </xsl:attribute> </item> <xsl:value-of select="@datetime"/> </xsl:template> атрибуту ничего не назначается, пусто, хотя <xsl:value-of select="datetime"/> выводятся ок, почему? Antonariy, в предложенном куске непонятен синтаксис <xsl:template match="item"> <item> </item> </xsl:template> при чем без этих <item></item> весь шаблон перестает работать ) объясни пожалуйста ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2014, 19:59 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
Переписал красиво) Не идет внедрение новых технологий (( Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
атрибуту ничего не назначается, пусто, хотя <xsl:value-of select="datetime"/> выводятся ок, почему? Antonariy, в предложенном куске непонятен синтаксис Код: xml 1. 2. 3. 4.
при чем без этих <item></item> весь шаблон перестает работать ) объясни пожалуйста ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2014, 21:01 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
шаблон соответствует элементу item, для каждого из них создается новый <item></item>, в который записывается атрибут datetime и копируется содержимое исходного item. из этих новых <item></item> в переменной $tmp создается новый xml-документ. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2014, 22:09 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
Валерьянкаи процессор будет их адекватно парсить?Нет. Если процессор знает такую функцию - он ее вызовет, если нет - появится ошибка Валерьянкаатрибуту ничего не назначается, пусто, хотя <xsl:value-of select="datetime"/> выводятся ок, почему?А если переписать так Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
что получится? Кроме того смущает запись Код: xml 1.
у Вас в исходном XML есть атрибут datetime? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2014, 22:15 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
_Vasilisk_Если процессор знает такую функцию - он ее вызовет, если нет - появится ошибка вообще никаких ошибок не выдает, просто не выводит ничего, мож быть поднастроить модуль XSLT для вывода ошибок? Кроме того смущает запись Код: xml 1.
_Vasilisk_ у Вас в исходном XML есть атрибут datetime? нет, в исходном XML такого атрибута нет, я пытался вывести вновь созданный атрибут для проверки, не так разве? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.08.2014, 17:56 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
_Vasilisk_А если переписать так что получится? _Vasilisk_, я смотрю в коде появились два номера 1 и 2, что это? в документации не встречал ... |
|||
:
Нравится:
Не нравится:
|
|||
25.08.2014, 18:01 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
Antonariyшаблон соответствует элементу item, для каждого из них создается новый <item></item>, в который записывается атрибут datetime и копируется содержимое исходного item. из этих новых <item></item> в переменной $tmp создается новый xml-документ. а исходный шаблон item содержит в себе (после модернизации) копию самого себя, который содержит копию самого себя с копией самого себя и так далее..похоже на бесконечный цикл......как это правильно представить? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.08.2014, 18:26 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
в голове на всякий случай прописал всё: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
вместо Код: xml 1.
прописал Код: xml 1. 2. 3. 4. 5. 6.
в описании шаблона прописал Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
не работает вообще, пустое место.., возвращаю назад Код: xml 1.
страница работает в исходном виде. как проверить содержимое добавленного атрибута? если просто выводом Код: xml 1.
нельзя? а как можно? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.08.2014, 18:53 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
ВалерьянкаAntonariyшаблон соответствует элементу item, для каждого из них создается новый <item></item>, в который записывается атрибут datetime и копируется содержимое исходного item. из этих новых <item></item> в переменной $tmp создается новый xml-документ. а исходный шаблон item содержит в себе (после модернизации) копию самого себяне содержит. исходный документ и содержимое $tmp абсолютно независимы. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2014, 16:28 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
Валерьянкаа исходный шаблон item содержит в себе (после модернизации) копию самого себя, который содержит копию самого себя с копией самого себя и так далее..похоже на бесконечный цикл......как это правильно представить?никак, потому что это не соответствует действительности. создается НОВЫЙ элемент item, в который копируется СОДЕРЖИМОЕ старого. новый документ от старого отличается только тем, что у item появился атрибут datetime. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2014, 16:34 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
Совершенно не видно в каком месте ошибка, ничего не выводится, как проверить, что common:node-set($item_time) вызывает или не вызывает ошибки процессора? как заставить процессор выводить ошибки? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2014, 17:58 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
Antonariyсоздается НОВЫЙ элемент item, в который копируется СОДЕРЖИМОЕ старого. новый документ от старого отличается только тем, что у item появился атрибут datetime. как же процессор отличит новый от старого, если в скрипте есть уже два блока <xsl:template match="item"> ? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2014, 18:29 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
Вообщем, не могу продвинутся или хотя-бы поэкспериментировать, потому что при вставке блока Код: xml 1. 2. 3.
или Код: xml 1. 2. 3.
страница не работает, а ошибки я не вижу.. может быть где-то в логах сервера можно поискать ошибки процессора? где? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2014, 19:28 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
прописал в системе E_Parse, увидел ошибки. Как только вставляю for each Код: xml 1. 2. 3.
вот что пишет парсер Предупреждение: DOMDocument::loadXML() [domdocument.loadxml]: Specification mandate value for attribute value-of in Entity, line: 359 в файле /home/privatesales/cms/modules/Xsl/Xsl.class.php (строка 267) Предупреждение: DOMDocument::loadXML() [domdocument.loadxml]: attributes construct error in Entity, line: 359 в файле /home/privatesales/cms/modules/Xsl/Xsl.class.php (строка 267) Предупреждение: DOMDocument::loadXML() [domdocument.loadxml]: Couldn't find end of Start Tag sort line 359 in Entity, line: 359 в файле /home/privatesales/cms/modules/Xsl/Xsl.class.php (строка 267) несоответствие спецификации? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2014, 15:01 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
Вот еще какие ошибки есть Предупреждение: XSLTProcessor::transformToDoc() [xsltprocessor.transformtodoc]: {urn:schemas-microsoft-com:xslt}node-set: called with too many arguments в файле /home/privatesales/cms/modules/Xsl/Xsl.class.php (строка 289) Предупреждение: XSLTProcessor::transformToDoc() [xsltprocessor.transformtodoc]: runtime error: file /home/privatesales/cms/ line 244 element for-each в файле /home/privatesales/cms/modules/Xsl/Xsl.class.php (строка 289) Предупреждение: XSLTProcessor::transformToDoc() [xsltprocessor.transformtodoc]: Failed to evaluate the 'select' expression. в файле /home/privatesales/cms/modules/Xsl/Xsl.class.php (строка 289) первая ошибка - "too many arguments"! что с этим можно сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2014, 15:11 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
Немного продвинулся! сработало расширение xmlns:exsl=" http://exslt.org/common"! но функция node-set() выдает не набор узлов, которые можно перебрать, а один единственный элемент - строку, в которой в кучу сложено все содержимое всех элементов item - названия цены описания и все такое, без каких либо разделителей! а в спецификации написано что это набор узлов. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2014, 14:22 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
Antonariyшаблон соответствует элементу item, для каждого из них создается новый <item></item>, в который записывается атрибут datetime и копируется содержимое исходного item. из этих новых <item></item> в переменной $tmp создается новый xml-документ. не сходится что-то с вашей теорией, в переменной $tmp нет xml-дерева, там есть значения узлов XML-дерева, что я смогу с ними сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2014, 17:58 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
Antonariy Код: xml 1. 2. 3.
зачем этот цикл? перебирается набор узлов, ...зачем? как к этим узлам приложить шаблон: ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2014, 20:04 |
|
Сортировка по элементам из двух уровней
|
|||
---|---|---|---|
#18+
Antonariyсоздается НОВЫЙ элемент item, в который копируется СОДЕРЖИМОЕ старого. новый документ от старого отличается только тем, что у item появился атрибут datetime. не сходится теория, XML не создается, Код: xml 1.
копирует и вставляет значения узлом XML, которые выводятся одной строкой вместе с исходным содержанием шаблона, но никак не XML В переменной $tmp тоже XML не создается, там одна строка из содержимого узлов XML, exsl:node-set($item_time) также XML не содержит, хотя если написать exsl:node-set($item_time)/item, тогда уже есть набор чего-то, неизвестно чего и по нему можно пройтись через for each, и даже посмотреть вновь созданный атрибут @datetime ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2014, 14:30 |
|
|
start [/forum/topic.php?all=1&fid=14&tid=1332321]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
53ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
others: | 314ms |
total: | 476ms |
0 / 0 |