Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用XSLT重命名和删除XML中的标记_Xml_Xslt_Rename - Fatal编程技术网

使用XSLT重命名和删除XML中的标记

使用XSLT重命名和删除XML中的标记,xml,xslt,rename,Xml,Xslt,Rename,我试图重命名和删除单个XSLT代码中的一些字段,但不知何故,重命名选项不起作用。 下面是我的带有SOAP标记的XML数据,需要删除这些标记并用所需的命名空间替换它们。同时,我应该更改XML标记的名称,因为源XML的特定名称应该更改 多谢各位 我的源XML <?xml version='1.0' encoding='utf-8'?> <soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/e

我试图重命名和删除单个XSLT代码中的一些字段,但不知何故,重命名选项不起作用。 下面是我的带有SOAP标记的XML数据,需要删除这些标记并用所需的命名空间替换它们。同时,我应该更改XML标记的名称,因为源XML的特定名称应该更改

多谢各位

我的源XML

    <?xml version='1.0' encoding='utf-8'?>
    <soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'>
        <soapenv:Header/>
        <soapenv:Body>
            <ParentTag>
                <tagRequest>
                    <Data1>FirstName</Data1>
                    <Data2>LastName</Data2>
                    <Value1>50</Value1>
                    <BooleanValue1>false</BooleanValue1>
                    <Address>
                        <StreetName>0000000</StreetName>
                        <Street-No>00000000000000</Street-No>
                    </Address>
                </tagRequest>
            </ParentTag>
        </soapenv:Body>
    </soapenv:Envelope>
目标输出XML应为:

    <ns0:MainNode xmlns:ns0="http://test/system">
    <ParentTag>
        <tagRequest>
            <Data1>FirstName</Data1>
            <Data2>LastName</Data2>
            <Value1>50</Value1>
            <BooleanValue1>false</BooleanValue1>
            <Address>
                <StreetName>0000000</StreetName>
                <StreetNo>00000000000000</StreetNo>
            </Address>
        </tagRequest>
    </ParentTag>
    </ns0:MainNode>
下面是我尝试过的XSLT:

        <?xml version='1.0' ?>
        <xsl:stylesheet version="1.0" xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/"
                                      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                                      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

            <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
            <xsl:template match="/">
                <ns0:MainNode xmlns:ns0="http://test/system">
                    <xsl:copy-of select="soapenv:Envelope/soapenv:Body/*" />
                </ns0:MainNode>
            </xsl:template>

            <xsl:template match="Street-No">
                <xsl:element name= "StreetNo">
                    <xsl:apply-templates select="node()|@*"/>
                </xsl:element>
            </xsl:template>

        </xsl:stylesheet>
将的xsl:copy更改为xsl:apply模板并添加标识模板。在这些更改之后,街道模板将不匹配。xsl:copy of实际上只复制元素树,而不在树上应用模板。这必须通过xsl:apply-templates来完成,它使用标识模板来复制与更特定模板不匹配的所有节点

我还将匹配表达式更改为与命名空间无关,如*[local name='Envelope']/*[local name='Body']/*这样就根本不使用soap命名空间

<?xml version='1.0' ?>
<xsl:stylesheet version="1.0" xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/"
                              xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />

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

    <xsl:template match="/">
        <ns0:MainNode xmlns:ns0="http://test/system">
            <xsl:apply-templates select="*[local-name()='Envelope']/*[local-name()='Body']/*" />
        </ns0:MainNode>
    </xsl:template>

    <xsl:template match="Street-No">
        <xsl:element name= "StreetNo">
            <xsl:apply-templates select="node()|@*"/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>
输出为:


非常感谢。我得到了期望的输出。但是它的名称空间附加为xmlns:soapenv=。有没有一种方法可以抑制这种情绪?@Ven:是的。是否可能您没有复制整个样式表?因为将XPath soapenv:Envelope/soapenv:Body/*替换为*[local name='Envelope']/*[local name='Body']/*并删除xmlns:soapenv=http://schemas.xmlsoap.org/soap/envelope/ 在这种情况下,xsl:stylesheet元素是故意使用的。
<?xml version="1.0" encoding="UTF-8"?>
<ns0:MainNode xmlns:ns0="http://test/system">
  <ParentTag>
        <tagRequest>
            <Data1>FirstName</Data1>
            <Data2>LastName</Data2>
            <Value1>50</Value1>
            <BooleanValue1>false</BooleanValue1>
            <Address>
                <StreetName>0000000</StreetName>
                <StreetNo>00000000000000</StreetNo>
            </Address>
        </tagRequest>
    </ParentTag>
</ns0:MainNode>