Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > xslt & namespace


Автор: hug 16.5.2008, 10:24
есть xml:
Код

<TourML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1.0" date="0001-01-01" time="00:00:00" xmlns="http://tourml.ru/products/2004-04-19">
.....
....
....
</TourML>

Пишу xslt:
Код

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

namespace различные и xslt transform не идет

Если из исхондого xml убираю xmlns="http://tourml.ru/products/2004-04-19" все идет нормально, но удалять ns неправильно. Подскажите пожалуйста как разрулить?


Автор: Muran 16.5.2008, 11:05
еднственное, что мне удалось сделать - 
это в xsl обявить такой же namespace в определении стайлщита

xmlns:ns="http://www.opengis.net/wms"

затем во всех match дописываю ns

типа 
Код

<xsl:template match="ns:element">
...
</xsl:template>

Автор: JVM 16.5.2008, 11:10
smile да просто в xsl добавь в корневой тег xmlns="http://tourml.ru/products/2004-04-19" и все ...


дело в том, что после того как ты ПЕРЕопределяешь в исходном xml префикс по умолчанию (xmlns="http://tourml.ru/products/2004-04-19") - задаешь новое пространство имен(http://tourml.ru/products/2004-04-19), ты должен использовать это же пространство имен и в xsl.
В xsl уже в принципе не важно какой ты установишь префикс для пространства имен, т.к. имеет смысл не сам префикс, а его значение.

Автор: hug 16.5.2008, 15:44
Спасибо большое за ответ
но странно
сделал как вы сказали но трансформ не идет
Код



<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://tourml.ru/products/2004-04-19">
    <xsl:template match="/">
    <root>
            <xsl:value-of select="//TourML/sources/source"/>

    </root>
    </xsl:template>


Output:
Код


<?xml version="1.0" encoding="utf-8"?><root xmlns:ns="http://tourml.ru/products/2004-04-19"></root>


Опять же удаляю неймспейс, все ок

Автор: Muran 18.5.2008, 11:52
попробуй так... 

Код

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="http://tourml.ru/products/2004-04-19">
    <xsl:template match="/">
    <root>
            <xsl:value-of select="//ns:TourML/ns:sources/ns:source"/>

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


Автор: hug 19.5.2008, 08:20
так получилось:
Но ns неохота писать:(

Автор: Muran 20.5.2008, 15:36
можно попробовать переименовать нэймспэйс.. задать что ns=#default

Код

<xsl:namespace-alias stylesheet-prefix="ns" result-prefix="#default"/>


я так написал, у меня с ходу не получилось... пока отложил.. попробуй, потом расскажешь результат smile

Автор: JVM 20.5.2008, 22:49
xsl:namespace-alias используется для отображения пространства имен, использующиеся в таблице стилей, в другое пространство имен, используемое в выводе и по этому не решит данной проблемы.

Надо признать, что я тоже был не прав и у этой проблемы(насколько я теперь понимаю) нет решения без использования префиксов. Дело в том, что в ражениях XPath игнорируются пространства имен по умолчанию. Т.е. если объявлено пространство имен по умолчанию(xmlns="http://tourml.ru/products/2004-04-19") в XSLT, то это не позволит обратиться к элементам <element> используя выражение XPath //element.

В общем надо объявлять префикс (xmlns:pref="http://tourml.ru/products/2004-04-19") и обращаться к <element> используя //pref:element.

Автор: DarkLordis 6.9.2010, 13:15
в общем решается эта проблема вроде (у меня решилась) крайне просто... (целый день думал что за фигня) 
Код

<xsl:template match="/">
    <xsl:apply-templates/>
</xsl:template>

а все потому что root-элемент не такой как все  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)