除一个节点外,删除所有名称空间

时间:2016-05-25 12:15:16

标签: xslt

给出以下源xml:

<?xml version="1.0" encoding="UTF-8"?>
<Test xmlns="http://someorg.org">
    <text>
        <status value="generated"/>
        <div xmlns="http://www.w3.org/1999/xhtml">
            <p>Some text</p>
            <p>Some text</p>
        </div>
    </text>
</Test>

我想拥有与上面的源xml相同的输出(源xml包含许多其他xml节点但是对于本节,我想按原样输出它,没有任何更改。)我有以下xslt(见下文)根据需要剥离其命名空间的元素。不幸的是,它还剥离了名称空间的div元素,但我想保留它们。我实现目标的最接近的是下面的xslt,但它因为apply-templates而输出div元素两次,但我只希望div元素与其命名空间一次。

这是我的xslt:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:f="http://someorg.org"
xmlns="http://someorg.org"
exclude-result-prefixes="f xsl">

    <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:template match="/">

        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match = "f:text/f:status">
    <status value ="generated"/>

            <div xmlns="http://www.w3.org/1999/xhtml">
                <xsl:apply-templates/>
            </div>
    </xsl:template>     
</xsl:stylesheet>

2 个答案:

答案 0 :(得分:3)

您可以只定位“http://someorg.org”命名空间中的元素,而不是尝试删除所有元素的命名空间(仅由<xsl:template match="*">模板处理)。只需将模板匹配更改为此

<xsl:template match="f:*">

对于“http://www.w3.org/1999/xhtml”命名空间中的元素,您可以使用身份模板来获取其他所有内容

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:f="http://someorg.org">
  <xsl:output method="xml" indent="yes" />
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

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

答案 1 :(得分:0)

添加模板

<xsl:template match="*[local-name()='div' 
 and namespace-uri() = 'http://www.w3.org/1999/xhtml']">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>

执行复制而不是创建名称空间剥离的元素。