Subject: Re: [xsl] Implementing XPointer Resolution With saxon:evaluate() From: "W. Eliot Kimber" <eliot@xxxxxxxxxx> Date: Wed, 14 Aug 2002 17:10:49 -0500 |
Jeni Tennison wrote: > > Hi Eliot, > > Sorry, I should have given more clues... Ok, here is a new version that appears to work correctly for all possible in-document links. Thanks for all the help. Cheers, Eliot <?xml version='1.0'?> <!-- Copyright (c) 2002 ISOGEN International This style sheet serves as a reference implementation of the XIndirect facility. It may be used without restriction as long as this copyright statement is preserved. This software is provided AS-IS without any warranty, express or implied. --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/TR/xlink" xmlns:xindr="http://www.isogen.com/papers/xindirection.xml" xmlns:xindrf="http://www.isogen.com/functions/xindirection" xmlns:saxon="http://icl.com/saxon" xmlns:func="http://exslt.org/functions" xmlns:fcommon="http://exslt.org/common" extension-element-prefixes="func xindrf" > <func:function name="xindrf:resolve-xpointer"> <xsl:param name="pointer-node"/><!-- The Element node that exhibits the XPointer to be resolved --> <xsl:param name="indirector-treatment">as-indirector</xsl:param> <xsl:variable name="indirector-treatment-str" select="string($indirector-treatment)"/> <xsl:variable name="xpointer"> <xsl:choose> <xsl:when test="starts-with($pointer-node/@href,'#')"> <xsl:value-of select="substring($pointer-node/@href, 2)"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$pointer-node/@href"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:for-each select="$pointer-node"> <!-- Setting the context to the pointer node so that relative URLs are resolved relative to the pointer node by saxon:evaluate() --> <xsl:choose> <xsl:when test="$xpointer != ''"> <xsl:variable name="direct-result-set" select="saxon:evaluate($xpointer)"/> <xsl:if test="string($direct-result-set) = ''"> <xsl:message>*** XIndirect warning: XPointer '<xsl:value-of select="$xpointer"/>' failed to address any nodes.</xsl:message> </xsl:if> <func:result select="xindrf:resolve-indirectors($direct-result-set, $indirector-treatment-str)"/> </xsl:when> <xsl:otherwise> <xsl:message> *** XIndirect error: $xpointer value is '' in resolve-xpointer. <func:result select="/.."/> </xsl:message> </xsl:otherwise> </xsl:choose> </xsl:for-each> </func:function> <func:function name="xindrf:resolve-indirectors"> <xsl:param name="pointer-node-set" select="/.."/> <xsl:param name="indirector-treatment">as-indirector</xsl:param> <xsl:variable name="indirector-treatment-str" select="string($indirector-treatment)"/> <xsl:choose> <xsl:when test="$pointer-node-set"> <xsl:variable name="car" select="$pointer-node-set[1]"/> <xsl:variable name="cdr" select="$pointer-node-set[position() > 1]"/> <xsl:choose> <xsl:when test="$car[self::xindr:indirector] and ($indirector-treatment-str != 'as-resource')"> <xsl:variable name="rns" select="xindrf:resolve-xpointer($car, $car/@indirector-treatment) | xindrf:resolve-indirectors($cdr, $indirector-treatment-str)"/> <func:result select="$rns"/> </xsl:when> <xsl:otherwise> <xsl:variable name="rest" select="xindrf:resolve-indirectors($cdr, $indirector-treatment-str)"/> <xsl:variable name="rns" select="$car | $rest"/> <func:result select="$rns"/> </xsl:otherwise> </xsl:choose> </xsl:when> <xsl:otherwise> <func:result select="/.."/> </xsl:otherwise> </xsl:choose> </func:function> </xsl:stylesheet> -- W. Eliot Kimber, eliot@xxxxxxxxxx Consultant, ISOGEN International 1016 La Posada Dr., Suite 240 Austin, TX 78752 Phone: 512.656.4139 XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Implementing XPointer Res, Jeni Tennison | Thread | Re: [xsl] Implementing XPointer Res, Wendell Piez |
Re: [xsl] selecting a parameter usi, J.Pietschmann | Date | Re: [xsl] Tabs, sascha |
Month |