Модераторы: diadiavova

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятки с XPath и Position, при разборе рекурсивного дерева 
V
    Опции темы
SelenIT
Дата 7.4.2007, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 4
Всего: 401



Продолжение недавней моей темы о разворачивании рекрсивного дерева одноименных элементов в плоский список.

Получить плоскую структуру удалось, но теперь еще нужно для каждой исходной ноды получить XPath-путь к ней. Предупреждая вопросы, что за изврат я делаю - это JS-меню для навигации по фактически XML-ной базе данных со вложенной структурой, по клику на пункты будут выбираться определенные подэлементы соответствующих нод.

При попытке получить желаемое, преобразуя файл
Код

<elem id="e1">
     <elem id="e2"/>
     <elem id="e3">
          <elem id="e8"/>
          <elem id="e9"/>
          <elem id="e10"/>
          <elem id="e11"/>
     </elem>

     <elem id="e5"/>
     <elem id="e6"/>
     <elem id="e7">
          <elem id="e12"/>
          <elem id="e13"/>
          <elem id="e14"/>
          <elem id="e15"/>
     </elem>
</elem>

с помощью такого XSL:
Код

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

<xsl:template match="elem">
    <xsl:param name="path"/>
    <xsl:element name="div">
    <xsl:value-of select="@id" />: <xsl:value-of select="$path"/>/elem[<xsl:value-of select="position()"/>]
    </xsl:element>
    <xsl:apply-templates select="./elem">
    <xsl:with-param name="path"><xsl:value-of select="$path"/>/elem[<xsl:value-of select="position()"/>]</xsl:with-param>
    </xsl:apply-templates>
</xsl:template>

</xsl:stylesheet>

я получил следующее:
Код

e1: /elem[2]
e2: /elem[2]/elem[1]
e3: /elem[2]/elem[2]
e8: /elem[2]/elem[2]/elem[1]
e9: /elem[2]/elem[2]/elem[2]
e10: /elem[2]/elem[2]/elem[3]
e11: /elem[2]/elem[2]/elem[4]
e5: /elem[2]/elem[3]
e6: /elem[2]/elem[4]
e7: /elem[2]/elem[5]
e12: /elem[2]/elem[5]/elem[1]
e13: /elem[2]/elem[5]/elem[2]
e14: /elem[2]/elem[5]/elem[3]
e15: /elem[2]/elem[5]/elem[4]

Никак не могу взять в толк, почему корневой элемент у меня вдруг везде оказался обозначен как /elem[2]? И что вообще я делаю неправильно?


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Exception
Дата 8.4.2007, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 3
Всего: 186



Код

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
<xsl:template match="/">
    <xsl:apply-templates select="elem" />
</xsl:template>

<xsl:template match="elem">
    <xsl:param name="path"/>
    <xsl:element name="div">
    <xsl:value-of select="@id" />: <xsl:value-of select="$path"/>/elem[<xsl:value-of select="position()"/>]
    </xsl:element>
    <xsl:apply-templates select="./elem">
    <xsl:with-param name="path"><xsl:value-of select="$path"/>/elem[<xsl:value-of select="position()"/>]</xsl:with-param>
    </xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>

PM   Вверх
SelenIT
Дата 8.4.2007, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 4
Всего: 401



Exception, еще раз спасибо, благодаря подсказкам решил свою задачу!

А все-таки, почему без отдельного
Код

<xsl:template match="/">
    <xsl:apply-templates select="elem" />
</xsl:template>
корневая нода для position() оказывалась второй, а не первой?


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
JVM
Дата 9.4.2007, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 30.10.2006

Репутация: 4
Всего: 5



А у меня с первым xsl получается
Код

<div xmlns="http://www.w3.org/1999/xhtml">e1: /elem[1]
  </div><div xmlns="http://www.w3.org/1999/xhtml">e2: /elem[1]/elem[1]
  </div><div xmlns="http://www.w3.org/1999/xhtml">e3: /elem[1]/elem[2]
  </div><div xmlns="http://www.w3.org/1999/xhtml">e8: /elem[1]/elem[2]/elem[1]
  </div><div xmlns="http://www.w3.org/1999/xhtml">e9: /elem[1]/elem[2]/elem[2]
  </div><div xmlns="http://www.w3.org/1999/xhtml">e10: /elem[1]/elem[2]/elem[3]
  </div><div xmlns="http://www.w3.org/1999/xhtml">e11: /elem[1]/elem[2]/elem[4]
  </div><div xmlns="http://www.w3.org/1999/xhtml">e5: /elem[1]/elem[3]
  </div><div xmlns="http://www.w3.org/1999/xhtml">e6: /elem[1]/elem[4]
  </div><div xmlns="http://www.w3.org/1999/xhtml">e7: /elem[1]/elem[5]
  </div><div xmlns="http://www.w3.org/1999/xhtml">e12: /elem[1]/elem[5]/elem[1]
  </div><div xmlns="http://www.w3.org/1999/xhtml">e13: /elem[1]/elem[5]/elem[2]
  </div><div xmlns="http://www.w3.org/1999/xhtml">e14: /elem[1]/elem[5]/elem[3]
    </div><div xmlns="http://www.w3.org/1999/xhtml">e15: /elem[1]/elem[5]/elem[4]
</div>

Использую xsltproc.
PM MAIL   Вверх
Exception
Дата 9.4.2007, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 3
Всего: 186



Интересно smile . Я тестил в FF.
PM   Вверх
SelenIT
Дата 9.4.2007, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 4
Всего: 401



Я тоже тестил в браузерах (FF2 и IE6). Вообще-то, на самом деле нужно мне это преобразование только для IE, под Microsoft.XMLDOM. Но то, что такие разные браузеры сходятся в неожиданном результате, наводит на мысль, что вряд ли он расходится со стандартом (который я пока, увы, довольно слабо понимаю)... Заранее благодарен за ликбез!


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
JVM
Дата 9.4.2007, 17:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 30.10.2006

Репутация: 4
Всего: 5



Если вы тестили через IE и FF, то все понятно почему у вас такой результат.
У вас наверняка в исходном xml есть строчка подобная этой
Код

<?xml-stylesheet type="text/xml" href="position.xsl" ?>

так вот эта инструкция и есть ваш первый элемент - а elem уже второй.
Чтобы управлять этим процессом рекомендую использовать <xsl:number>

Используйте процессоры, а не проузеры smile 
PM MAIL   Вверх
SelenIT
Дата 9.4.2007, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 4
Всего: 401



Цитата(JVM @  9.4.2007,  17:28 Найти цитируемый пост)
наверняка в исходном xml есть строчка подобная этой

Точно! Есть такая строчка. Вот, значит, где обака порылась... сроду бы не подумал. JVM, огромное спасибо за разъяснение!

Цитата(JVM @  9.4.2007,  17:28 Найти цитируемый пост)
Используйте процессоры, а не проузеры

Ну задача передо мной стоит - дело должно происходить на клиенте, не я ее ставил... А чем, собственно, Microsoft.XMLDOM не процессор?


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Exception
Дата 10.4.2007, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 3
Всего: 186



Цитата(SelenIT @  9.4.2007,  18:36 Найти цитируемый пост)
Ну задача передо мной стоит - дело должно происходить на клиенте, не я ее ставил... А чем, собственно, Microsoft.XMLDOM не процессор? 


Имеется в виду, чтобы XSL применялся через вызов метода процессора. а не из-за обработки браузером инструкции xml-stylesheet.
PM   Вверх
JVM
Дата 10.4.2007, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 30.10.2006

Репутация: 4
Всего: 5



Цитата(SelenIT @  9.4.2007,  17:36 Найти цитируемый пост)
дело должно происходить на клиенте
А есть ли примеры такого подхода? Хотел бы посмотреть.

Дело в том что мне не понятны мотивы, которые перевешивают в пользу обработки xml на стороне клиента, а не на стороне сервера.

PM MAIL   Вверх
Exception
Дата 10.4.2007, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 3
Всего: 186



Цитата(JVM @  10.4.2007,  09:38 Найти цитируемый пост)
А есть ли примеры такого подхода? Хотел бы посмотреть.


Например. XML загружается с сервера асинхронно.
PM   Вверх
JVM
Дата 10.4.2007, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 30.10.2006

Репутация: 4
Всего: 5



Exception, объясни поподробнее что это значит и какие дает преимущества.

Это сообщение отредактировал(а) JVM - 10.4.2007, 17:30
PM MAIL   Вверх
Exception
Дата 10.4.2007, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 3
Всего: 186



Скажем, мы реализуем autocomplete для текстбокса как в Google Suggest. В зависимости от запроса мы грузим с сервера XML с вариантами автозаполнения и динамически применяем к нему XSL. Грузить уже преобразованную версию слишком накладно, да и код логики сервера мешается с кодом отображения на клиенте.
PM   Вверх
JVM
Дата 11.4.2007, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 30.10.2006

Репутация: 4
Всего: 5



Почитал про Google Suggest, но так и не нашел, где речь идет об XSL. XML возвращается smile , но насколько я понимаю обрабатывает его JavaScript. Где можно почитать об испоьзовании XSL или как убедиться в этом?
PM MAIL   Вверх
Exception
Дата 11.4.2007, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 3
Всего: 186



Цитата(JVM @  11.4.2007,  10:16 Найти цитируемый пост)
XML возвращается


Цитата(JVM @  11.4.2007,  10:16 Найти цитируемый пост)
обрабатывает его JavaScript


А я о чём? К полученному XML применяется XSL и мы получаем готовый HTML-код.

http://goog-ajaxslt.sourceforge.net/
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

Прежде чем опубликовать вопрос, попробуйте воспользоваться поиском - возможно тема уже поднималась.

Также рекомендуем Вам зайти в раздел FAQ ,раздел дополняется и, возможно, там вы увидите готовое решение.

Для ответов на часто задаваемые вопросы существует FAQ раздела. Новости можно публиковать в разделе новостей. Для статей так же есть специальный раздел

Желаем удачи в Вашем деле!


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | XML, XSL | Следующая тема »


 




[ Время генерации скрипта: 0.0604 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.