XSLT 在父级定义了名称空间时删除元素

XSLT to remove element when parent has namespace defined

我有以下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.

知道如何在父元素定义了命名空间的情况下删除元素吗?提前致谢!

how to remove an element if a parent element has a namespace defined?

问题是而不是 "parent element has a namespace defined"。 所有 XML 输入中的元素都在根元素中声明的默认命名空间中(命名空间是继承的)。

要处理此类元素,您必须在样式表中声明命名空间,为其分配一个前缀,并在 selecting/matching 元素时使用该前缀:

<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>

请注意,这会保留 身份转换 模板传递的所有节点上的原始命名空间。