[xsl] How to output the unused namespaces in the XML document?

Subject: [xsl] How to output the unused namespaces in the XML document?
From: "Costello, Roger L." <costello@xxxxxxxxx>
Date: Mon, 30 Aug 2010 16:38:11 -0400
Hi Folks,

Consider this XML document:

<?xml version="1.0"?>
<N1:NumberList xmlns:N1="http://www.example1.org";
               xmlns:N2="http://www.example2.org";>
        <Number>23</Number>
        <Number>41</Number>
        <Number xmlns:N3="http://www.example3.org";>70</Number>
        <Number>103</Number>
        <Number>99</Number>
        <Number>6</Number>
</N1:NumberList>

Notice that there are three (3) namespaces, but two of them are unused:

    http://www.example2.org

    http://www.example3.org

I want an XSLT transform that will output all the unused namespaces in the
input XML document.

Here's the solution I came up with:


    <xsl:template match="*">
        <xsl:variable name="elem" select="." />
        <xsl:for-each select="namespace::*[. !=
'http://www.w3.org/XML/1998/namespace']">
            <xsl:variable name="ns" select="." />
            <xsl:if test="not($elem/ancestor::*[namespace::* = $ns])">
                <xsl:if test="not($elem/descendant-or-self::*[namespace-uri()
= $ns])">
                    This namespace is unused: <xsl:value-of select="$ns" />
                </xsl:if>
            </xsl:if>
        </xsl:for-each>
        <xsl:apply-templates select="*" />
    </xsl:template>


Is there a better solution? (I am using XSLT 1.0)

/Roger

Current Thread