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>
请注意,这会保留 身份转换 模板传递的所有节点上的原始命名空间。
我有以下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>
请注意,这会保留 身份转换 模板传递的所有节点上的原始命名空间。