Re: Пространство имен и XSL процессор
От: kostya.misura  
Дата: 04.09.07 12:57
Оценка: 1 (1)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pref='http://test.ru'>
<xsl:output method="html" encoding="UTF-8" version="1.0"/>
<xsl:template match="/">

<b><xsl:value-of select="/pref:test/pref:a"/></b>

</xsl:template>
</xsl:stylesheet>
Пространство имен и XSL процессор
От: ctalker  
Дата: 04.09.07 12:19
Оценка:
Здравствуйте!

Такая проблема.
Использую XSL процессор (Sablotron – но здесь это не важно).

На вход такая XML:

<?xml version="1.0" encoding="utf-8"?>
<test>
<a>TEST</a>
</test>


И такое преобразование:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8" version="1.0"/>
<xsl:template match="/">

<b><xsl:value-of select="/test/a"/></b>

</xsl:template>
</xsl:stylesheet>


Это нормально работает и на выходе получаем:

<b>TEST</b>




Немного изменяем входную XML – добавляем пространство имен:

<?xml version="1.0" encoding="utf-8"?>
<test xmlns=”http://test.ru”>
<a>TEST</a>
</test>



XSL файл прежний – на выходе – пусто.
Не получается обратиться по пути "/test/a" – этот путь получается неверным.

Вопрос. Как быть в этом случае, какой будет правильный путь?

Единственное, что смог придумать – перебор всех элементов из XML с помощью for-each и нахождение нужного путем сравнения <xsl:if test="name() = 'a'">.
Думаю, что это некорректный способ и существует более изящное решение.


Кстати, если добавить префикс <test xmlns:pref=”http://test.ru”> — то все нормально работает.

Поясните, пожалуйста.

(Предлагать изменение входного XML не надо – хотелось бы разобраться именно с описанной ситуацией)
Re: Пространство имен и XSL процессор
От: sergey_shandar США http://getboost.codeplex.com/
Дата: 05.09.07 01:53
Оценка:
Здравствуйте, ctalker, Вы писали:

C>Вопрос. Как быть в этом случае, какой будет правильный путь?


Попробуй так
<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns="http://test.ru">
<xsl:output method="html" encoding="UTF-8" version="1.0"/>
<xsl:template match="/">

<b><xsl:value-of select="/test/a"/></b>

</xsl:template>
</xsl:stylesheet>

Или так:
<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:MySuperPuperPrefix="http://test.ru">
<xsl:output method="html" encoding="UTF-8" version="1.0"/>
<xsl:template match="/">

<b><xsl:value-of select="/MySuperPuperPrefix:test/MySuperPuperPrefix:a"/></b>

</xsl:template>
</xsl:stylesheet>


C>Кстати, если добавить префикс <test xmlns:pref=”http://test.ru”> — то все нормально работает.

Эта запись почти не имеет смысла, потому что, объявляет что префикс pref равен "http://test.ru", а потом этот префикс никто не использует. Зачем тогда его объявлять?

C>(Предлагать изменение входного XML не надо – хотелось бы разобраться именно с описанной ситуацией)


Я предлагаю сначала понять что такое namespace в XML. Например здесь.
getboost.codeplex.com
citylizard.codeplex.com
Re[2]: Пространство имен и XSL процессор
От: ctalker  
Дата: 05.09.07 04:41
Оценка:
Всем большое спасибо за ответы!

Вариант с префиксом решил задачу.

Такой вариант:
<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns="http://test.ru">
<xsl:output method="html" encoding="UTF-8" version="1.0"/>
<xsl:template match="/">

<b><xsl:value-of select="/test/a"/></b>

</xsl:template>
</xsl:stylesheet>


НЕ прошел. Пришлось добавлять префикс.

sergey_shandar, благодарю за ссылку — буду разбираться с пространством имен!
Re[3]: Пространство имен и XSL процессор
От: sergey_shandar США http://getboost.codeplex.com/
Дата: 05.09.07 04:58
Оценка:
Здравствуйте, ctalker, Вы писали:

C>НЕ прошел. Пришлось добавлять префикс.


Да, моя ошибка. xmlns="..." не действует на XPath. Только через префикс.
getboost.codeplex.com
citylizard.codeplex.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.