Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Сортировка по элементам из двух уровней / 25 сообщений из 36, страница 1 из 2
15.08.2014, 15:34
    #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
15.08.2014, 16:17
    #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
15.08.2014, 16:20
    #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
15.08.2014, 16:59
    #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
15.08.2014, 17:11
    #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
15.08.2014, 17:22
    #38721471
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по элементам из двух уровней
Нужно создать промежуточный xml
Код: xml
1.
2.
3.
<item datetime="если есть модификации, взять дату модификации, иначе {datetime}">
   потроха
</item>

и отсортировать по item/@datetime
...
Рейтинг: 0 / 0
15.08.2014, 17:25
    #38721473
Сортировка по элементам из двух уровней
Antonariy, это HostCMS, там нет возможности в кишках ковыряться, я могу разве что дополнительным параметром в динамической php-странице запросить дополнительные поля из базы, которые появятся в XML
...
Рейтинг: 0 / 0
15.08.2014, 17:29
    #38721482
Сортировка по элементам из двух уровней
в таблице товаров у каждой модификации есть заполненное поле с ID-материнского товара, я могу его добавить в XML, но я не представляю как это может помочь
...
Рейтинг: 0 / 0
15.08.2014, 17:32
    #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
15.08.2014, 17:41
    #38721494
Сортировка по элементам из двух уровней
ага, Спасибо за идею! нечто новое для меня, надо обмозговать,
спасибо!
...
Рейтинг: 0 / 0
16.08.2014, 16:54
    #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
16.08.2014, 19:10
    #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
16.08.2014, 19:21
    #38721785
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по элементам из двух уровней
Валерьянкаменя смущает msxlt, от него майкрософтом пахнет) , мож. быть несовместимость с процессором?В понедельник покажу код для всех процессоров
...
Рейтинг: 0 / 0
18.08.2014, 18:06
    #38722829
Сортировка по элементам из двух уровней
_Vasilisk_ , обещал код показать )
...
Рейтинг: 0 / 0
18.08.2014, 19:51
    #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
19.08.2014, 18:50
    #38723783
Сортировка по элементам из двух уровней
ааа, так для использования функций от microsoft просто нужно было сначала объявить о них
в <xsl:stylesheet прописью xmlns:msxsl="urn:schemas-microsoft-com:xslt?

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

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

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

и процессор будет их адекватно парсить?я что-то сомневаюсь, но ведь попытка не пытка же? всего-то xmlns:msxsl дописать.
...
Рейтинг: 0 / 0
19.08.2014, 19:59
    #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
19.08.2014, 21:01
    #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
19.08.2014, 22:09
    #38723914
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка по элементам из двух уровней
шаблон соответствует элементу item, для каждого из них создается новый <item></item>, в который записывается атрибут datetime и копируется содержимое исходного item. из этих новых <item></item> в переменной $tmp создается новый xml-документ.
...
Рейтинг: 0 / 0
19.08.2014, 22:15
    #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
25.08.2014, 17:56
    #38728381
Сортировка по элементам из двух уровней
_Vasilisk_Если процессор знает такую функцию - он ее вызовет, если нет - появится ошибка
вообще никаких ошибок не выдает, просто не выводит ничего, мож быть поднастроить модуль XSLT для вывода ошибок?

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



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

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

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

а исходный шаблон item содержит в себе (после модернизации) копию самого себя, который содержит копию самого себя с копией самого себя и так далее..похоже на бесконечный цикл......как это правильно представить?
...
Рейтинг: 0 / 0
25.08.2014, 18:53
    #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
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Сортировка по элементам из двух уровней / 25 сообщений из 36, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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