当父命名空间已定义时,XSLT删除元素

时间:2016-06-06 16:12:01

标签: xml xslt xml-namespaces

我有以下XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<envelopeSummary xmlns="http://www.docusign.com/restapi" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <envelopeId>123</envelopeId>
    <status>sent</status>
    <statusDateTime>2016-06-02</statusDateTime>
    <uri>/envelopes/123</uri>
</envelopeSummary>

我试图提出将删除 uri 元素的XSLT。我已经尝试过下面的XSLT,但它没有删除uri元素。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

<xsl:template match="uri"/>

</xsl:stylesheet>

有趣的是,如果我摆脱了原始XML的envelopeSummary元素中定义的名称空间,它就可以工作。不幸的是,我无法修改XML。

如果父元素定义了命名空间,是否知道如何删除元素?提前谢谢!

1 个答案:

答案 0 :(得分:0)

  

如果父元素定义了命名空间,如何删除元素?

问题是&#34;父元素定义了名称空间&#34;。 所有 XML输入中的元素都位于根元素声明的默认命名空间中(名称空间是继承的)。

要解决此类元素,您必须在样式表中声明命名空间,为其指定前缀并在选择/匹配元素时使用该前缀:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns0="http://www.docusign.com/restapi">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="ns0:uri"/>

</xsl:stylesheet>

请注意,这会保留 identity transform 模板传递的所有节点上的原始名称空间。