Здравствуйте!
Такая проблема.
Использую 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 не надо – хотелось бы разобраться именно с описанной ситуацией)
<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>
Здравствуйте, 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. Например
здесь.
Всем большое спасибо за ответы!
Вариант с префиксом решил задачу.
Такой вариант:
<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, благодарю за ссылку — буду разбираться с пространством имен!
Здравствуйте, ctalker, Вы писали:
C>НЕ прошел. Пришлось добавлять префикс.
Да, моя ошибка. xmlns="..." не действует на
XPath. Только через префикс.