XSLT-преобразование генерирует пустое пространство имен - PullRequest
1 голос
/ 19 марта 2012

У меня есть XML-файл, который необходимо преобразовать с помощью XSLT, я добавляю узел в поддерево.Входной файл выглядит следующим образом:

 <?xml version="1.0" encoding="UTF-8"?>
    <Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Context>
    <ContextExtra>
        <ns3:timestampList xmlns:ns3="http://www.mydomain.com/myAdapter/basicMessage/1.0" 
                           xmlns:ns2="http://www.mydomain.com/myAdapter/tbMessage/1.0" 
                           xmlns="http://www.mydomain.com/myAdapter/timestamp/1.0" 
                           xmlns:ns10="http://www.mydomain.com/myAdapter/coMessage/1.0" 
                           xmlns:ns11="http://www.mydomain.com/myAdapter/lolMessage/1.0" 
                           xmlns:ns12="http://www.mydomain.com/myAdapter/tcMessage/1.0" 
                           xmlns:ns13="http://www.mydomain.com/myAdapter/bMessage/1.0" 
                           xmlns:ns4="http://www.mydomain.com/myAdapter/tiMessage/1.0" 
                           xmlns:ns5="http://www.myDomain.com/myAdapter/oriMessage/1.0" 
                           xmlns:ns6="http://www.myDomain.com/myAdapter/eiMessage/1.0" 
                           xmlns:ns7="http://www.myDomain.com/myAdapter/fplscMessage/1.0" 
                           xmlns:ns8="http://www.myDomain.com/myAdapter/psMessage/1.0" 
                           xmlns:ns9="http://www.myDomain.com/myAdapter/stMessage/1.0">
            <timestampInfo>
                <timestampID>START</timestampID>
                <timestamp>2012-02-25T00:30:18.705+01:00</timestamp>
                <description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
            </timestampInfo>
            <timestampInfo>
                <timestampID>END</timestampID>
                <timestamp>2012-02-25T00:30:23.675+01:00</timestamp>
                <description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
            </timestampInfo>
        </ns3:timestampList>

    </ContextExtra>
</Context>

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

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

<xsl:output method="xml" indent="yes" />    

<xsl:param name="newTimeStamp">
    <timestampInfo>
        <timestampID>
            <xsl:text>TEST TEST</xsl:text>
        </timestampID>
        <timestamp>
            <xsl:text>2012-02-25T00:30:23.654+01:00</xsl:text>
        </timestamp>
        <description>
            <xsl:text>this is a test</xsl:text>
        </description>
    </timestampInfo>
</xsl:param>

<xsl:template match="//ts:timestampInfo[position()=last()]">
    <xsl:call-template name="identity" />
    <xsl:copy-of select="$newTimeStamp" />
</xsl:template>

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

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

<?xml version="1.0" encoding="UTF-8"?>
 <Envelope>
<Context>
    <ContextExtra>
        <ns3:timestampList xmlns="http://www.myDomain.com/myAdapter/timestamp/1.0" xmlns:ns3="http://www.myDomain.com/myAdapter/basicMessage/1.0">
            <timestampInfo>
                <timestampID>MTA_START</timestampID>
                <timestamp>2012-02-25T00:30:18.705+01:00</timestamp>
                <description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
            </timestampInfo>
            <timestampInfo>
                <timestampID>MTA_END</timestampID>
                <timestamp>2012-02-25T00:30:23.675+01:00</timestamp>
                <description xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
            </timestampInfo>
            <timestampInfo xmlns="">
                <timestampID>TEST TEST</timestampID>
                <timestamp>2012-02-25T00:30:23.654+01:00</timestamp>
                <description>This is a test</description>
            </timestampInfo>
        </ns3:timestampList>
    </ContextExtra>
</Context>

Как видите, timestampInfo узлы имеют атрибут xmlns="".То есть генерируется пустое пространство имен.Вместо <timestampInfo xmlns=""> я хотел бы иметь узлы вида <timestampInfo>.Входной файл имеет этот формат, и я не могу его контролировать.

Как мне этого добиться?

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

Ответы [ 2 ]

0 голосов
/ 19 марта 2012

Помните, что объявления пространства имен существуют только в сериализованном выводе.В результирующем дереве, которое генерирует ваше преобразование, важно не то, какие объявления пространства имен существуют (потому что их нет), а, скорее, как называется каждый элемент?Проблема с вашим преобразованием состоит в том, что элементы timestampInfo имеют неправильное имя - в частности, они имеют правильное локальное имя, но неправильное пространство имен.Получите правильные имена элементов, и сериализатор позаботится о создании объявлений пространства имен.И, конечно, когда вы используете буквальный элемент результата, имя элемента в дереве результатов совпадает с именем элемента в таблице стилей (пространство имен и все).

0 голосов
/ 19 марта 2012

Укажите пространство имен добавляемого timestampInfo:

<xsl:param name="newTimeStamp"> 
    <timestampInfo xmlns="http://www.myDomain.com/myAdapter/timestamp/1.0"> 
        <timestampID> 
            <xsl:text>TEST TEST</xsl:text> 
        </timestampID> 
        <timestamp> 
            <xsl:text>2012-02-25T00:30:23.654+01:00</xsl:text> 
        </timestamp> 
        <description> 
            <xsl:text>this is a test</xsl:text> 
        </description> 
    </timestampInfo> 
</xsl:param> 
...