2013-05-08 2 views
0

У меня есть следующие XML:XSLT преобразование Переселение Xmlns Instance

<root xmlns:myns="derf"> 
    <child> 
     <grandchild>mikey</grandchild> 
    </child> 
</root> 

И я пытаюсь включить его в следующий XML:

<root xmlns="theNamespace" xmlns:myns="derf"> 
    <child> 
     <grandchild>mikey</grandchild> 
    </child> 
</root> 

Я думал, что следующий XSLT бы сделать это:

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

<!-- identity template --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="root"> 
    <root xmlns="theNamespace"> 
     <xsl:apply-templates select="@*|node()"/> 
    </root> 
</xsl:template> 

Хотя, который излучает:

<root xmlns="theNamespace"> 
    <child xmlns="" xmlns:myns="derf"> 
     <grandchild>mikey</grandchild> 
    </child> 
</root> 

Может кто-нибудь помочь мне понять - и в идеале исправить - почему этот xmlns:myns="derf" заканчивается на узле вместо узла root на моем выходе?

Я в основном просто хочу увеличить исходный XML с помощью значения пространства имен xmlns.

Заранее спасибо, Matt

ответ

0

Есть две проблемы - во-первых, вы только ставящие root элемент в theNamespace пространстве имен, поэтому дочерние элементы все еще находятся в их исходном (нулевом) пространства имен. Во-вторых, <xsl:copy> выполняет задачу копирования пространств имен элементов, но литеральный элемент не будет. Этот XSLT должен вести себя так, как вы описываете:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 

    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="*[name() = local-name()]"> 
    <xsl:element name="{name()}" namespace="theNamespace"> 
     <xsl:copy-of select="namespace::*[name() != '']" /> 
     <xsl:apply-templates select="@* | node()" /> 
    </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

При запуске на своем входе пробы, результат:

<root xmlns="theNamespace" xmlns:myns="derf"> 
    <child> 
    <grandchild>mikey</grandchild> 
    </child> 
</root> 
+0

волшебный, спасибо. также спасибо за объяснения. –

Смежные вопросы