powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Сортировка по элементам из двух уровней
36 сообщений из 36, показаны все 2 страниц
Сортировка по элементам из двух уровней
    #38721364
Привет гениальным парням! )
есть такой 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 самого свежего вложенного товара (модификации)?
я много чего перепробовал, уже чувствую тупик. Может быть есть идея?
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38721423
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<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>

обалденный xml.
угадай, где должен быть закрывающий тэг.
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38721428
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
даже если так

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<item>
  <datetime>07.08.2014 10:11:59</datetime>
  <item>
    <datetime>07.08.2014 10:11:59</datetime>
    <item>
      <datetime>07.08.2014 10:11:59</datetime>
      <modifications>
        <item>
          <datetime>07.08.2014 10:14:29</datetime>
          <item>
            <datetime>07.08.2014 10:11:59</datetime>
            <item>
              <datetime>07.08.2014 10:11:59</datetime>
            </modifications>
      <item>
        <datetime>07.08.2014 10:11:59</datetime>
        <item>
          <datetime>07.08.2014 10:11:59</datetime>

все равно бардак
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38721457
оригинальный xml чрезмерно большой, там десятки полей и атрибутов, я взял основное, ну ведь очевидно же:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
<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> />
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38721463
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
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38721471
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно создать промежуточный xml
Код: xml
1.
2.
3.
<item datetime="если есть модификации, взять дату модификации, иначе {datetime}">
   потроха
</item>

и отсортировать по item/@datetime
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38721473
Antonariy, это HostCMS, там нет возможности в кишках ковыряться, я могу разве что дополнительным параметром в динамической php-странице запросить дополнительные поля из базы, которые появятся в XML
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38721482
в таблице товаров у каждой модификации есть заполненное поле с ID-материнского товара, я могу его добавить в XML, но я не представляю как это может помочь
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38721485
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Промежуточный xml создается в самом xsl:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<xsl:variable name="tmp">
    <xsl:apply-templates select="item"/>
<xsl:variable>

<xsl:for-each select="msxsl:node-set($tmp)">
   <xsl:sort />
</xsl:for-each>

<xsl:template match="item">
  <item>
      <xsl:attibute name="datetime">
         <xsl:choose>...</xsl:choose>
      </xsl:attibute>
      <xsl:copy-of select="*"/>
  </item>
</xsl:template>
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38721494
ага, Спасибо за идею! нечто новое для меня, надо обмозговать,
спасибо!
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38721769
А что, конструкция
<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
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38721784
это не работает:
Код: plaintext
1.
2.
3.
<xsl:variable name="tmp"><xsl:apply-templates select="item" /></xsl:variable>    
<xsl:for-each select="msxsl:node-set($tmp)" >                                        
       <xsl:sort  select = "datetime" order="Descending"/>
</xsl:for-each >   

меня смущает msxlt, от него майкрософтом пахнет) , мож. быть несовместимость с процессором?

попробовал вывести посмотреть на содержимое этой функции через value-of, тоже ничего не видно

как только ставлю на место

Код: plaintext
1.
2.
3.
4.
<xsl:apply-templates select="item" >                                       
	                         
        <xsl:sort  select = "datetime" order="Descending"/>
                                                                
</xsl:apply-templates >

сразу все работает, что не так?
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38721785
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерьянкаменя смущает msxlt, от него майкрософтом пахнет) , мож. быть несовместимость с процессором?В понедельник покажу код для всех процессоров
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38722829
_Vasilisk_ , обещал код показать )
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38722921
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерьянка_Vasilisk_ , обещал код показать )Точно. Забыл.
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  xmlns:func="http://exslt.org/functions"
  xmlns:common="http://exslt.org/common">

  <func:function name="msxsl:node-set">
    <xsl:param name="ANodes"/>
    <func:result select="common:node-set($ANodes)"/>
  </func:function>
</xsl:stylesheet>

Теперь при вызове
Код: xml
1.
msxsl:node-set($nodes)

трансформер от Microsoft будет вызывать свою функцию, а всякие Xalan и Saxon будут вызывать пользовательскую функцию, которая внутри вызывает их родную common:node-set().
Если же совместимость с Microsoft не нужна, то достаточно просто в коде сразу дергать common:node-set() и свою функцию не определять
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38723783
ааа, так для использования функций от microsoft просто нужно было сначала объявить о них
в <xsl:stylesheet прописью xmlns:msxsl="urn:schemas-microsoft-com:xslt?

это главная идея, да?

и процессор будет их адекватно парсить?
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38723794
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерьянкаааа, так для использования функций от microsoft просто нужно было сначала объявить о них
в <xsl:stylesheet прописью xmlns:msxsl="urn:schemas-microsoft-com:xslt?

это главная идея, да?

и процессор будет их адекватно парсить?я что-то сомневаюсь, но ведь попытка не пытка же? всего-то xmlns:msxsl дописать.
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38723835
Не идет внедрение новых технологий ((

<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> весь шаблон перестает работать )
объясни пожалуйста
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38723879
Переписал красиво)

Не идет внедрение новых технологий ((

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<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, в предложенном куске непонятен синтаксис
Код: xml
1.
2.
3.
4.
<xsl:template match="item">
  <item>
  </item>
</xsl:template>


при чем без этих <item></item> весь шаблон перестает работать )
объясни пожалуйста
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38723914
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шаблон соответствует элементу item, для каждого из них создается новый <item></item>, в который записывается атрибут datetime и копируется содержимое исходного item. из этих новых <item></item> в переменной $tmp создается новый xml-документ.
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38723917
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерьянкаи процессор будет их адекватно парсить?Нет. Если процессор знает такую функцию - он ее вызовет, если нет - появится ошибка
Валерьянкаатрибуту ничего не назначается, пусто, хотя <xsl:value-of select="datetime"/> выводятся ок, почему?А если переписать так
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<xsl:template match="item">
  <item>
    <xsl:attribute name="datetime">
       <xsl:choose>
         <xsl:when test="count(modifications/item) > 0">
            1 -<xsl:value-of select="modifications/item[1]/datetime"/>
         </xsl:when>
         <xsl:otherwise>
            2 -<xsl:value-of select="datetime"/>
         </xsl:otherwise>
       </xsl:choose>
    </xsl:attribute>
  </item>
  <xsl:value-of select="@datetime"/>
</xsl:template>

что получится?

Кроме того смущает запись
Код: xml
1.
<xsl:value-of select="@datetime"/>

у Вас в исходном XML есть атрибут datetime?
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38728381
_Vasilisk_Если процессор знает такую функцию - он ее вызовет, если нет - появится ошибка
вообще никаких ошибок не выдает, просто не выводит ничего, мож быть поднастроить модуль XSLT для вывода ошибок?

Кроме того смущает запись
Код: xml
1.
 <xsl:value-of select="@datetime"/>



_Vasilisk_ у Вас в исходном XML есть атрибут datetime?

нет, в исходном XML такого атрибута нет, я пытался вывести вновь созданный атрибут для проверки, не так разве?
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38728386
_Vasilisk_А если переписать так
что получится?

_Vasilisk_, я смотрю в коде появились два номера 1 и 2, что это? в документации не встречал
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38728408
Antonariyшаблон соответствует элементу item, для каждого из них создается новый <item></item>, в который записывается атрибут datetime и копируется содержимое исходного item. из этих новых <item></item> в переменной $tmp создается новый xml-документ.

а исходный шаблон item содержит в себе (после модернизации) копию самого себя, который содержит копию самого себя с копией самого себя и так далее..похоже на бесконечный цикл......как это правильно представить?
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38728438
в голове на всякий случай прописал всё:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  xmlns:func="http://exslt.org/functions" xmlns:common="http://exslt.org/common">
	<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
		encoding="utf-8" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml" />
<func:function name="msxsl:node-set">
    <xsl:param name="ANodes"/>
    <func:result select="common:node-set($ANodes)"/>
 </func:function>


вместо
Код: xml
1.
<xsl:apply-templates select="item"/>


прописал
Код: xml
1.
2.
3.
4.
5.
6.
<xsl:variable name="item_time">
    <xsl:apply-templates select="item"/>
</xsl:variable>
<xsl:for-each select="common:node-set($item_time)">
   <xsl:sort value-of select="@datetime"/>
</xsl:for-each>


в описании шаблона прописал
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<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:copy-of select="*"/>
		</xsl:attribute>
	</item>
...остальной..код шаблона.......	
</xsl:template>



не работает вообще, пустое место.., возвращаю назад
Код: xml
1.
<xsl:apply-templates select="item"/>


страница работает в исходном виде.
как проверить содержимое добавленного атрибута? если просто выводом
Код: xml
1.
<xsl:value-of select="@datetime"/>


нельзя? а как можно?
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38729268
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВалерьянкаAntonariyшаблон соответствует элементу item, для каждого из них создается новый <item></item>, в который записывается атрибут datetime и копируется содержимое исходного item. из этих новых <item></item> в переменной $tmp создается новый xml-документ.

а исходный шаблон item содержит в себе (после модернизации) копию самого себяне содержит.
исходный документ и содержимое $tmp абсолютно независимы.
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38729280
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерьянкаа исходный шаблон item содержит в себе (после модернизации) копию самого себя, который содержит копию самого себя с копией самого себя и так далее..похоже на бесконечный цикл......как это правильно представить?никак, потому что это не соответствует действительности.
создается НОВЫЙ элемент item, в который копируется СОДЕРЖИМОЕ старого. новый документ от старого отличается только тем, что у item появился атрибут datetime.
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38732025
Совершенно не видно в каком месте ошибка, ничего не выводится,
как проверить, что common:node-set($item_time) вызывает или не вызывает ошибки процессора? как заставить процессор выводить ошибки?
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38732062
Antonariyсоздается НОВЫЙ элемент item, в который копируется СОДЕРЖИМОЕ старого. новый документ от старого отличается только тем, что у item появился атрибут datetime.

как же процессор отличит новый от старого, если в скрипте есть уже два блока
<xsl:template match="item"> ?
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38732120
Вообщем, не могу продвинутся или хотя-бы поэкспериментировать, потому что при вставке блока
Код: xml
1.
2.
3.
<xsl:for-each select="msxsl:node-set($item_time)">
   <xsl:sort value-of select="@datetime"/>
</xsl:for-each>


или
Код: xml
1.
2.
3.
<xsl:for-each select="common:node-set($item_time)">
   <xsl:sort value-of select="@datetime"/>
</xsl:for-each>


страница не работает, а ошибки я не вижу..
может быть где-то в логах сервера можно поискать ошибки процессора? где?
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38732813
прописал в системе E_Parse, увидел ошибки.
Как только вставляю for each

Код: xml
1.
2.
3.
<xsl:for-each select="msxsl:node-set($tmp)" > 
       <xsl:sort  select = "datetime" order="Descending"/>
</xsl:for-each >



вот что пишет парсер
Предупреждение: 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)

несоответствие спецификации?
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38732822
Вот еще какие ошибки есть

Предупреждение: 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"!
что с этим можно сделать?
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38733336
Немного продвинулся!
сработало расширение xmlns:exsl=" http://exslt.org/common"!
но функция node-set() выдает не набор узлов, которые можно перебрать, а один единственный элемент - строку, в которой в кучу сложено все содержимое всех элементов item - названия цены описания и все такое, без каких либо разделителей! а в спецификации написано что это набор узлов.
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38733386
Antonariyшаблон соответствует элементу item, для каждого из них создается новый <item></item>, в который записывается атрибут datetime и копируется содержимое исходного item. из этих новых <item></item> в переменной $tmp создается новый xml-документ.

не сходится что-то с вашей теорией, в переменной $tmp нет xml-дерева, там есть значения узлов XML-дерева, что я смогу с ними сделать?
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38733413
Antonariy
Код: xml
1.
2.
3.
<xsl:for-each select="msxsl:node-set($tmp)">
   <xsl:sort />
</xsl:for-each>



зачем этот цикл? перебирается набор узлов, ...зачем? как к этим узлам приложить шаблон:
...
Рейтинг: 0 / 0
Сортировка по элементам из двух уровней
    #38733565
Antonariyсоздается НОВЫЙ элемент item, в который копируется СОДЕРЖИМОЕ старого. новый документ от старого отличается только тем, что у item появился атрибут datetime.

не сходится теория, XML не создается,

Код: xml
1.
<xsl:copy-of select="*"/>



копирует и вставляет значения узлом XML, которые выводятся одной строкой вместе с исходным содержанием шаблона, но никак не XML
В переменной $tmp тоже XML не создается, там одна строка из содержимого узлов XML, exsl:node-set($item_time) также XML не содержит, хотя если написать exsl:node-set($item_time)/item, тогда уже есть набор чего-то, неизвестно чего и по нему можно пройтись через for each, и даже посмотреть вновь созданный атрибут @datetime
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Сортировка по элементам из двух уровней
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]