Re: Select specific node and namespaces

Hi Corey,

Snow, Corey wrote:

>All pretty straightforward so far, I'd guess. However, when a node fails to
>be validated against the Schematron rules, I'd like to replace it. My
>validating stylesheet, generated by schematron-xml.xsl, produces output that
>contains a "failed-assert" node for each instance node that failed to be
>validated for whatever reason. One of the properties of the failed-assert
>node is a property called "Location". It contains something like the
>following:
>
>/topic[1]/content[1]/para[1]/link[1]
>  
>
presumably these elements are in the default namespace. I hadn't 
realised that name() returns an unqualified name for nodes that are in a 
non-blank default namespace.

<snip/>

>However, if I add
>the namespace before the query:
>
>objXMLDoc.setProperty "SelectionNamespaces", "xmlns:myns="mynamespaceURN"
>
>It still fails unless I modify the XPath to something like:
>/myns:topic[1]/myns:content[1]/myns:para[1]/myns:link[1]
>
Have you tried:

    objXMLDoc.setProperty "SelectionNamespaces", "xmlns=mynamespaceURN"

to set the default namespace? Don't worry if it doesn't work, see 
below...  

>Another thing I'm considering is trying to modify "schematron-xml.xsl" so it
>generates fully namespace-qualified XPath, but I'd prefer not to do that
>unless I have to. I don't think it would be very portable
>
Well, you could replace the template in skeleton1-5.xsl with this one 
line mod:

            <!-- utility routine for implementations -->
            <axsl:template match="*|@*" mode="schematron-get-full-path">
                <axsl:apply-templates select="parent::*" 
mode="schematron-get-full-path"/>
                <axsl:text>/</axsl:text>
                <axsl:if test="count(. | ../@*) = count(../@*)">@</axsl:if>
                <axsl:if test="not(namespace-uri(.)='') and 
not(contains(name(.), ':'))">_dns:</axsl:if>
                <axsl:value-of select="name()"/>
                <axsl:text>[</axsl:text>
                <axsl:value-of 
select="1+count(preceding-sibling::*[name()=name(current())])"/>
                <axsl:text>]</axsl:text>
            </axsl:template>

It's a bit of a hack since it arbitrarily associates the prefix "_dns:" 
with what was the default namespace - I'd be open to better suggestions.

Francis.

Received on Wednesday, 12 June 2002 09:29:31 UTC