XSLT更改名称空间 - 版本兼容性

时间:2017-02-17 22:45:22

标签: xslt xslt-1.0

原帖:

XSLT to change namespace in element

关于我之前用xslt程序替换命名空间的帖子。我已经回答了问题,但在使用我的系统进行测试时,它显示错误,因为应用系统我工作支持1.0版

请提供一些帮助,使代码与1.0版兼容。以下是xsl:

<xsl:stylesheet
    version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xsd="http://www.xx.com"
    xmlns:ns="http://www.mnv.com/elc/sap"
    exclude-result-prefixes="ns"> 

    <xsl:output encoding='UTF-8' indent='yes' method='xml'/>

    <!-- copy everything into the output -->
    <xsl:template match='@*|node()'>
        <xsl:copy>
            <xsl:apply-templates select='@*, node()'/>
        </xsl:copy>
    </xsl:template>

    <!-- template to match ns:IRenvelope element and creating a new element -->
    <xsl:template match="ns:IRenvelope">
        <xsl:element name="IRL" namespace="http://www.xx.com">
            <xsl:apply-templates select="@*, node()"/>
        </xsl:element>
    </xsl:template>

    <!-- 
        template to change the namespace 
        of the elements  
        from "http://www.mnv.com/elc/sap" 
        to "http://www.xx.com" 
    -->

    <xsl:template match="ns:*">
        <xsl:element name="{local-name()}" namespace="http://www.xx.com">
            <xsl:apply-templates select="@*, node()"/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

我的xml消息是:

<GMessage xmlns="http://www.giffgaff.uk/CM/envelope">
    <EnvelopeVersion>2.0</EnvelopeVersion>
    <body>
        <IRenvelope xmlns="http://www.mnv.com/elc/sap">
            <Keys>
                <Key Type="TaxOfficeNumber">635</Key>
            </Keys>
        </IRenvelope>
    </body>
</GMessage>

预期结果:

<?xml version="1.0" encoding="UTF-8"?>
<GMessage xmlns="http://www.giffgaff.uk/CM/envelope">
    <EnvelopeVersion>2.0</EnvelopeVersion>
    <body>
        <IRL xmlns="http://www.xx.com">
            <Keys>
                <Key Type="TaxOfficeNumber">635</Key>
            </Keys>
        </IRL>
    </body>
</GMessage>

1 个答案:

答案 0 :(得分:1)

问题完全在于这些问题......

 <xsl:apply-templates select='@*, node()'/>

此语法在XSLT 1.0中无效。在XSLT 2.0中,逗号用于构建&#34;序列&#34;。

但是,您可以简单地用此替换该行的出现,这将在XSLT 1.0和2.0中都有效

<xsl:apply-templates select='@*|node()'/>

管道字符是用于连接节点集的union运算符。