XSLT从元素(根节点除外)中删除前缀



如何从所有元素中删除前缀urn,从根节点中删除前缀execept?

XML输入

<urn:client xmlns:urn='www.testing.com' xmlns:x='http://schemas.xmlsoap.org/soap/envelope/'>
    <urn:header>
        <urn:desc1>undefined</urn:desc1>
        <urn:desc2>undefined</urn:desc2> 
    </urn:header>
    <urn:itens1>
        <urn:item1>undefined
            <urn:name1>undefined</urn:name1>
            <urn:name2>undefined</urn:name2>
        </urn:item1>
    </urn:itens1>
    <urn:itens2>
        <urn:item1>undefined
            <urn:name1>undefined</urn:name1>
            <urn:name2>undefined</urn:name2>
        </urn:item1>
        <urn:item2>undefined
            <urn:name1>undefined</urn:name1>
            <urn:name2>undefined</urn:name2>
        </urn:item2>
    </urn:itens2>
</urn:client>

XML输出

<urn:client xmlns:urn='www.testing.com' xmlns:x='http://schemas.xmlsoap.org/soap/envelope/'>
    <header>
        <desc1>undefined</desc1>
        <desc2>undefined</desc2> 
    </header>
    <itens1>
        <item1>undefined
            <name1>undefined</name1>
            <name2>undefined</name2>
        </item1>
    </itens1>
    <itens2>
        <item1>undefined
            <name1>undefined</name1>
            <name2>undefined</name2>
        </item1>
        <item2>undefined
            <name1>undefined</name1>
            <name2>undefined</name2>
        </item2>
    </itens2>
</urn:client>

我尝试使用以下XSLT代码

    <?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="*">
    <xsl:element name="{local-name(.)}">
      <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:stylesheet>

但是,根节点中的前缀和命名空间也将被删除。

你们有什么想法吗?

Tks

怎么样:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
    <xsl:element name="{local-name()}">
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
<xsl:template match="/*">
    <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates/>      
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>

这假设输入XML中的属性不在名称空间中(通常是这样)。事实上,给定的示例根本没有属性,因此可以完全删除<xsl:copy-of select="@*"/>指令。

最新更新