删除xslt中具有特定命名空间的所有元素

时间:2014-01-23 18:20:41

标签: xslt xslt-2.0 xml-namespaces

我有一个xml,我想更改大多数元素的命名空间,删除一些特定的元素名称,并删除包含特定命名空间的元素。这种xml的例子

<root xmlns="somenamespace">
   <elem1>sometext</eleme1>
   <ns0:elem2 xmlns:ns0="othernamespace">
       <ns1:elem3 xmlns:ns1="thirdnamespace" />
   </ns0:elem2>
   <elem4>sometext</elem4>
</root>

我正在尝试使用以下xslt:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">    
    <xsl:template match="*[namespace-uri() = 'somenamespace']">
        <xsl:choose>
            <!-- change element name from root to root2 -->
            <xsl:when test="local-name(.)='root'">
                <xsl:element name="root2" namespace="mynamespace">
                    <xsl:apply-templates select="@* | node()" />
                </xsl:element>
            </xsl:when>
            <!-- skip these elements that are not in root2 -->
            <xsl:when test="local-name(.)='elem1'" />
            <xsl:when test="namespace-uri()='othernamespace'" />
            <!-- Copy other elemnts -->
            <xsl:otherwise>
                <xsl:element name="{name()}" namespace="mynamespace">
                    <xsl:apply-templates select="@* | node()" />
                </xsl:element>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

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

输出xml应为

<root2 xmlns="mynamespace">
   <elem4>sometext</elem4>
</root2>

但结果是

<root2 xmlns="mynamespace" xmlns:ns0="othernamespace">
   <ns0:elem2>
       <ns1:elem3 xmlns:ns1="thirdnamespace" />
   </ns0:elem2>
   <elem4>sometext</elem4>
</root2>

似乎xslt的大多数元素都在工作,除了应该删除特定命名空间的所有元素的元素。上面的xslt有什么问题吗?

1 个答案:

答案 0 :(得分:0)

您的第一个模板仅匹配somenamespace命名空间中的元素。其他名称空间(othernamespacethirdnamespace)由标识转换(最后一个模板)匹配,并按原样输出。

要删除somenamespace命名空间中不包含的所有元素,请添加以下模板:

<xsl:template match="*[not(namespace-uri()='somenamespace')]" priority="1"/>