XML XSLT преобразовать в XML - PullRequest
       4

XML XSLT преобразовать в XML

0 голосов
/ 02 апреля 2012

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

У меня есть элементы, которые создаются. ОК. У меня просто проблемы с правильной работой пространств имен.

Проблема в том, что каждое отдельное пространство имен в области текущего элемента выводится для каждого отдельного элемента. Я хочу выводить только пространства имен, так как они впервые объявлены в исходном XML.

Это то, что я сейчас пытаюсь сделать, я попробовал несколько вещей и не могу найти способ сделать то, что мне нужно.

Я вызываю шаблон, который отвечает за преобразование атрибутов для текущего узла:

<xsl:call-template name="elementAttributes">
        <xsl:with-param name="element" select="."/>
</xsl:call-template>

Со следующим шаблоном:

<xsl:template name="elementAttributes">
        <xsl:param name="element"/>
        <xsl:for-each select="$element/namespace::*">
            <!--dont include default namespace-->
            <xsl:if test="boolean(name())">
                <xsl:text> </xsl:text>
                <xsl:value-of select="name()"/>
                <xsl:text>='</xsl:text>
                <xsl:value-of select="."/>
                <xsl:text>'</xsl:text>
            </xsl:if>
        </xsl:for-each>
</xsl:template>

Так, например, с XML:

<valueString>
        <dms:animal xmlns:dms="http://test.net/2012/dms/">
            <dms:dog>woof</dms:dog>
            <dms:cat>meow</dms:cat>
            <reptile:crocodile xmlns:reptile="http://reptile.test.net/2012/dms/"></reptile:crocodile>
        </dms:animal>
</valueString>

Я заканчиваю с:

<dms:animal dcds='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' dms='http://test.net/2012/dms/' ns0='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' xml='http://www.w3.org/XML/1998/namespace'>
<dms:dog dcds='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' dms='http://test.net/2012/dms/' ns0='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' xml='http://www.w3.org/XML/1998/namespace'>woof</dms:dog>
<dms:cat dcds='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' dms='http://test.net/2012/dms/' ns0='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' xml='http://www.w3.org/XML/1998/namespace'>meow</dms:cat>
<reptile:crocodile dcds='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' dms='http://test.net/2012/dms/' ns0='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' reptile='http://reptile.test.net/2012/dms/' xml='http://www.w3.org/XML/1998/namespace'/>

когда я в основном хочу получить тот же XML.

Я знаю, что можно легко выполнить копирование, чтобы легко скопировать XML в вывод, но я, поскольку выводил результаты в виде текста из-за формата JSON, не смог заставить его работать таким образом, поскольку только текстовые узлы будет скопирована, а не структура XML.

1 Ответ

1 голос
/ 02 апреля 2012

Я бы сказал, что вы пытаетесь сделать довольно странный дизайн. Все мои инстинкты - вернуться к стадии требований и посмотреть, будет ли другой дизайн более разумным.

Однако, если вы действительно хотите делать то, что пытаетесь сделать, вам придется проверять каждое пространство имен и выводить его только в том случае, если пространство имен находится в области видимости этого элемента, а не родительского элемента.

...