I'm not exactly sure what you mean by "used" and "unused": is this a
property of the namespace prefix, or the namespace URI, or the
combination of both? And does "used" mean used in an element name, or do
you also need to look at attribute names?
I'm assuming you're trying to do this without using namespace nodes, as
they are deprecated.
Let's assume that a namespace URI is "used" if an element or attribute
is in that namespace:
<xsl:function name="is-used" as="xs:boolean">
<xsl:param name="doc"/>
<xsl:param name="uri" as="xs:string"/>
<xsl:sequence select="some $n in $doc//*/(.|@*)
satisfies namespace-uri($n) eq $uri"/>
</xsl:function>
Now the full set of prefix=uri pairs declared in the document is:
<xsl:variable name="doc" select="/"/>
<xsl:variable name="all-pairs" select="
for $e in $doc//*, $p in get-in-scope-prefixes($e)
return concat($p, '=', get-namespace-uri-for-prefix($e, $p))"/>
And those that are unique are:
<xsl:variable name="distinct-pairs" select="
distinct-values($all-pairs)"/>
So the output is:
<xsl:for-each select="$distinct-pairs">
<xsl:value-of select="., '(', is-used($doc, substring-after(., '=')),
')'"/>
</xsl:for-each>
Michael Kay
-----Original Message-----
From: owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com] On Behalf Of
Timothy M. Lebo
Sent: 10 October 2003 18:27
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] XSLT and XPath 2.0: finding unused namespace
declarations
Hello,
As an exercise for adapting to the changes in XSLT and Xpath
2.0, I'm trying to write a stylesheet to report all
namespaces that are in scope anywhere in the document, what
their NCNames and expansions are, and the status of their usage.
For Example, with an input document:
<root
xmlns:first="first.com"
xmlns:second="second.com"
xmlns:third="third.com">
<first:child xmlns:fourth="fourth.com">
<second:grandchild xmlns:fifth="fifth.com/>
</first:child>
</root>
The stylesheet would return something like:
Xml = w3.org/XML/98/namespace (unused)
first = first.com (used)
second = second.com (used)
third = third.com (unused)
fourth = fourth.com (unused)
fifth = fifth.com (unused)
I continue to run into problems with datatypes and sequences.
What is the best way to mold one's understanding of node sets
to understand how to manipulating sequences? It would seem to
me if I had a set of in-scope nodes and I knew the namespace
being used, it is a matter of set containment.
Here is the code, which I am very ashamed to distribute. It
falls short in many respects, including style. I would much
prefer to expunge the for loops.
Regards,
Timothy M. Lebo
Research Associate
Smart Information Flow Technologies
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:value-of select="concat(base-uri(.),$newline)"/>
<xsl:value-of select="concat(' declares: ',$newline,'
')"/>
<xsl:value-of select="get-in-scope-namespaces(*[1])"/>
<xsl:value-of select="concat($newline,' usage :
',$newline)"/>
<xsl:for-each-group select="//*" group-by="namespace-uri()">
<xsl:variable name="me" select="."/>
<xsl:variable name="myNS"
select="get-namespace-from-QName(node-name($me))"/>
<xsl:variable name="my_inScope_NS"
select="get-in-scope-namespaces(.)"/>
<xsl:for-each select="get-in-scope-namespaces(.)">
<xsl:sort select="."/>
<xsl:if test="get-namespace-uri-for-prefix($me,.) = $myNS">
<xsl:value-of select="concat(' ',.,' =
',get-namespace-uri-for-prefix($me,.))"/>
</xsl:if>
</xsl:for-each>
<xsl:if test="some $x in $my_inScope_NS satisfies $x =
get-namespace-uri-for-prefix($me,$x)">
<xsl:value-of select="concat(' (used)',$newline)"/>
</xsl:if>
<xsl:if test="every $x in $my_inScope_NS satisfies
not($x = get-namespace-uri-for-prefix($me,$x))">
<xsl:value-of select="concat(' (unused)',$newline)"/>
</xsl:if>
</xsl:for-each-group>
</xsl:template>
<xsl:variable name="newline">
<xsl:text>
</xsl:text>
</xsl:variable>
</xsl:stylesheet>
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list