2015-03-06 6 views
0

Я пишу xslt для преобразования экспорта xml файла в другую систему. Я хочу добавить корневой узел и определить для него такое пространство имен:xslt определить пространство имен только для корневого узла

<xsl:template match="*"> 
    <root xmlns="http://somedefinition"> 
    <xsl:apply-templates select="fm:ROW" /> 
    </root> 
</xsl:template> 

<xsl:template match="fm:ROW"> 
<name><xsl:value-of select="fm:name"/></name> 
<name2><xsl:value-of select="fm:name2" /></name2> 
<street><xsl:value-of select="fm:street" /></street> 
</xsl:template> 

Я вызываю тогда другой шаблон. Узлы, созданные этим шаблоном, также получают определение xmln, которое пусто. Как я могу это предотвратить?

выход выглядит следующим образом:

<root xmlns="http://somedefinition"> 
    <name xmlns="">Lack AG</name> 
    <name2 xmlns="">Freie Strasse</name2> 
    <street xmlns="">55</street> 
</root> 

ТНХ за помощь

ответ

2

Этот выход является правильным, потому что вы создаете root элемент в http://somedefinition пространстве имен, а также ряд других элементов в no пространство имен. Чтобы сериализовать это точно, процессор должен добавить xmlns="" переопределения.

Чтобы получить вывод, который вы хотите, вам нужно будет создать name, name2 и street элементы в том же пространстве имен http://somedefinition как root элемента. Самый простой способ добиться того, чтобы удалить xmlns="http://somedefinition" из root элемента внутри первого шаблона, и вместо того, чтобы поставить его на xsl:stylesheet элементе в корне таблицы стилей документа

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
     xmlns:fm="..." 
     xmlns="http://somedefinition"><!-- and any other required namespaces --> 

    <xsl:template match="*"> 
    <root> 
     <xsl:apply-templates select="fm:ROW" /> 
    </root> 
    </xsl:template> 

    <xsl:template match="fm:ROW"> 
    <name><xsl:value-of select="fm:name"/></name> 
    <name2><xsl:value-of select="fm:name2" /></name2> 
    <street><xsl:value-of select="fm:street" /></street> 
    </xsl:template> 
</xsl:stylesheet> 

Теперь все префиксы буквальных результатов элементов в таблица стилей использует пространство имен, объявленное в xmlns="....", на xsl:stylesheet, и они будут созданы в правильном пространстве имен в дереве вывода. Когда сериализатор приходит, чтобы записать это дерево как XML, он может сделать это, поставив xmlns="..." только на элемент root.

+0

Нет, действительно, это ** является ** (было) правильным пространством имен. –

+0

@ michael.hor257k Я верю вам, но, учитывая, что OP предоставил только частичную таблицу стилей в вопросе, я хотел бы дать понять, что мой ответ - это только частичный заголовок 'xsl: stylesheet'. –