Re: [xsl] document() and fragment

Subject: Re: [xsl] document() and fragment
From: Oleg Tkachenko <olegt@xxxxxxxxxxxxx>
Date: Mon, 17 Dec 2001 11:27:31 +0200
Brian Smith wrote:

Saxon 6.4.4 supports using a fragment identifier (bare name xpointer) with the document function like this: document("doc.xml#text"). This is very handy but it is causing me a problem with the way the resulting node-set is rooted.

Lets say I have this document, doc.xml (assume "id" is an ID attribute):

 <root>
   <package id="a1" name="javax">
       <package id="a2" name="swing">
          <package id="a3" name="text"/>
       </package>
   </package>
 </root>

Now, lets say I'm processing another document, and I evaluate the expression document("doc.xml#a3"). Saxon will return a node-set with a root node containing the package element with id "a3" ("text"). But, I need to traverse the ancestor:: axis in order to get the fully-qualified name of the package ("javax.swing.text"), such as by doing this:

<xsl:for-each select='document("doc.xml#text")/*
                                      /ancestor-or-self::package'>
     <xsl:value-of select='@name'/>
     <xsl:if test='position() != last()'>.</xsl:if>
</xsl:for-each>

Unfortunately, this doesn't work because the result of "document()" will be rooted at the "a3" node, not at the actual root of the doucment.

Is there any way around this? I wish the document() function behaved in a way that would allow me to access the ancestors and predecessors of the selected element.


So, if you want to see the whole document you can't only take a fragment.

What about this:
<xsl:for-each select='document("doc.xml")//package[@name="text"]
                                       /ancestor-or-self::package'>
      <xsl:value-of select='@name'/>
      <xsl:if test='position() != last()'>.</xsl:if>
</xsl:for-each>

--
Oleg Tkachenko
Multiconn International, Israel


XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list



Current Thread