Re: [xsl] Embedding the XPath of an input Text Fragment in output

Subject: Re: [xsl] Embedding the XPath of an input Text Fragment in output
From: Wendell Piez <wapiez@xxxxxxxxxxxxxxxx>
Date: Thu, 12 Jun 2008 16:09:20 -0400
At 12:00 PM 6/12/2008, David wrote:
>    <xsl:template match="*" mode="xpath-step">
>      <xsl:text>/</xsl:text>
>      <xsl:value-of select="name()"/>
>      <xsl:if test="count(../*[name()=name(current())]) > 1">
>        <xsl:text>[</xsl:text>
>        <xsl:value-of
> select="count(preceding-sibling::*[name()=name(current())]) + 1"/>
>        <xsl:text>]</xsl:text>
>      </xsl:if>
>    </xsl:template>

The schematron sources have several variants of this, targetting
different use cases. using name() is fine for human-oriented paths in
error reprorting etc, but if you need to execute the paths the problem
is thatit uses namespace prefixes from the  source file, so you need to
bind the same prefixes in the context that the xpath is executed.

Quite true.


(BTW -- somewhat OT -- where are the Schematron XSLTs obtainable?)

   <xsl:template match="*" mode="xpath-step">
     <xsl:text>/*</xsl:text>
     <xsl:if test="count(../*) > 1">
       <xsl:text>[</xsl:text>
       <xsl:value-of select="count(preceding-sibling::*) + 1"/>
       <xsl:text>]</xsl:text>
     </xsl:if>
   </xsl:template>

makes xpaths that are a bit less informative to a human reader  /*[33]
instead of /xhtml:table[2]  but don't have a dependency on namespace
context.

Similarly but oppositely, one can intervene to make the path even more informative to the human reader, while sometimes more dependent on local context, as in


<xsl:template match="div" mode="xpath-step">
   <xsl:text>/div[@id='</xsl:text>
   <xsl:value-of select="@id"/>
   <xsl:text>']</xsl:text>
</xsl:template>

... when one knows that every div has an @id, each @id is unique, and they are useful.

So you get paths like

/tei/text/div[@id='ch2']/p[3]

and such.

(variants of this generate /*[local-name()='table'][2] or (for xpath 2)
/*:table[2] if you want a version which shows the variable name but
without namespace dependency)

Cool.


Cheers,
Wendell



======================================================================
Wendell Piez                            mailto:wapiez@xxxxxxxxxxxxxxxx
Mulberry Technologies, Inc.                http://www.mulberrytech.com
17 West Jefferson Street                    Direct Phone: 301/315-9635
Suite 207                                          Phone: 301/315-9631
Rockville, MD  20850                                 Fax: 301/315-8285
----------------------------------------------------------------------
  Mulberry Technologies: A Consultancy Specializing in SGML and XML
======================================================================

Current Thread