Как заменить префикс uri пространства имен и корневой элемент на xslt 2.0 - PullRequest
0 голосов
/ 01 марта 2019

У меня есть XML-файл, который содержит элементы с префиксом пространства имен и соответствующим URI.

Я хочу сделать две вещи:

  1. Заменить URI пространства имен и префиксс другим в xml: xmlns: urn = "http://abcd" до xmlns: xsns =" ​​http://123", так что <urn:FirstELement> становится <xsns:SecondElement>

  2. корневым элементомнеобходимо заменить: <urn:RootElementOld xmlns:urn="http://abcd"> заменить на <xsns:RootElementNew xmlns:xsns="http://123">

Входной XML (аналогично фактическому):

    <urn:RootElementOld xmlns:urn="http://abcd">
    <urn:FirstElement>
        <urn:FirstSubElement id1="abc" id2="efg">FirstValue</urn:FirstSubElement>
        <urn:SecondSubElement id3="hij" id4="klm">SecondValue</urn:SecondSubElement>
    </urn:FirstElement>
    <urn:SecondElement>
        <urn:ThirdSubElement id5="nop" id6="qrs">ThirdValue</urn:ThirdSubElement>
        <urn:FourthSubElement id7="tuv" id8="wxy">FourthValue</urn:FourthSubElement>
    </urn:SecondElement>
</urn:RootElementOld>

Ожидаемый вывод XML:

    <xsns:RootElementNew xmlns:xsns="http://123">
    <xsns:FirstElement>
        <xsns:FirstSubElement id1="abc" id2="efg">FirstValue</xsns:FirstSubElement>
        <xsns:SecondSubElement id3="hij" id4="klm">SecondValue</xsns:SecondSubElement>
    </xsns:FirstElement>
    <xsns:SecondElement>
        <xsns:ThirdSubElement id5="nop" id6="qrs">ThirdValue</xsns:ThirdSubElement>
        <xsns:FourthSubElement id7="tuv" id8="wxy">FourthValue</xsns:FourthSubElement>
    </xsns:SecondElement>
</xsns:RootElementNew>

Мой вывод:

    <xsns:RootElementOld xmlns:xsns="http://123">
    <xsns:FirstElement>
        <xsns:FirstSubElement id1="abc" id2="efg">FirstValue</xsns:FirstSubElement>
        <xsns:SecondSubElement id3="hij" id4="klm">SecondValue</xsns:SecondSubElement>
    </xsns:FirstElement>
    <xsns:SecondElement>
        <xsns:ThirdSubElement id5="nop" id6="qrs">ThirdValue</xsns:ThirdSubElement>
        <xsns:FourthSubElement id7="tuv" id8="wxy">FourthValue</xsns:FourthSubElement>
    </xsns:SecondElement>
</xsns:RootElementOld>

Мой XSLT:

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:urn="http://abcd"
    xmlns:xsns="http://123" exclude-result-prefixes="urn">
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />
    <xsl:strip-space elements="*" />

    <xsl:template match="*">
        <xsl:element name="xsns:{local-name(.)}" namespace="http://123">
            <xsl:apply-templates select="@* | node()" />
        </xsl:element>
    </xsl:template>

    <xsl:template match="@*">
        <xsl:attribute name="{local-name(.)}"> 
        <xsl:value-of select="." /> 
        </xsl:attribute>
    </xsl:template>

    <xsl:template match="urn:RootElementOld">
        <xsl:element name="xsns:RootElementNew" namespace="http://123">
            <xsl:apply-templates select="@* | node()" />
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

Не могли бы вы мне помочь?Я новичок в XSLT.

...