powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Сортировка по элементам из двух уровней
25 сообщений из 36, страница 1 из 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
25 сообщений из 36, страница 1 из 2
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Сортировка по элементам из двух уровней
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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