XSLT 使用 local-name() 删除与另一个 namespaced/prefixed 节点同名的节点

XSLT Removing node having same name as with another namespaced/prefixed node using local-name()

我正在尝试从我的 XML 中删除 <create><accountNumber>

我设法删除了 <create> 并使用 //*[local-name()='create'] 保留了它的子节点,这一切都很好。

问题:

<accountNumber><ns2:accountNumber>

同名

当我执行 //*[local-name()='accountNumber'] 时,它会删除 <accountNumber><ns2:accountNumber>。我想保留 <ns2:accountNumber>

样本输入XML

<root xmlns="http://xmlns.example.com/v1" 
        xmlns:ns2="http://xmlns.example/v2">
        
    <accountNumber>1234567</accountNumber>
    <create>
        <ns2:profile>
            <ns2:accountNumber>1234567</ns2:accountNumber>
        </ns2:profile>
    </create>
</root>

期望输出XML

<root xmlns="http://xmlns.example.com/v1" 
        xmlns:ns2="http://xmlns.example.com/v2">

        <ns2:profile>
            <ns2:accountNumber>1234567</ns2:accountNumber>
        </ns2:profile>
</root>

我的XSL代码

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

    <xsl:output method="xml" encoding="utf-8" indent="yes" />

    <!-- Copy all text nodes, elements and attributes -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>

    <xsl:template
        match="//*[local-name()='create'] | //*[local-name()='accountNumber']">
        <xsl:apply-templates select="*" />
    </xsl:template>

</xsl:stylesheet>

我仍然想不出如何在不影响 namespaced/prefixed <ns2:accountNumber>

的情况下正确引用 <accountNumber>

如有任何帮助,我将不胜感激。

不要忽略命名空间,而是使用它:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="http://xmlns.example.com/v1">
<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="create">
    <xsl:apply-templates />
</xsl:template>

<xsl:template match="accountNumber"/>

</xsl:stylesheet>

参见:https://www.w3.org/TR/xslt20/#unprefixed-qnames