xsl-list
[Top] [All Lists]

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

2010-08-30 15:38:26
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

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>