xsl-list
[Top] [All Lists]

Re: [xsl] Write context xpath expression

2009-10-21 21:37:41
I have successfully used something like the following:
---------
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
  <xsl:template match="/">
    <xsl:apply-templates select=".//c"/>
  </xsl:template>
  <xsl:template match="c">
    <xsl:message>
      <xsl:for-each select="ancestor-or-self::*">
        <xsl:value-of select="concat( '/', local-name(.) )"/>
      </xsl:for-each>
      <xsl:text>[</xsl:text>
      <xsl:value-of select="position()"/>
      <xsl:text>]</xsl:text>
    </xsl:message>
  </xsl:template>
</xsl:stylesheet>
---------
Of course this drops the namespace information. (Which could be
important in your situation, but didn't matter in mine where there
were no name collisions in the documents). Also, I think this may
give you undesired counts in the square brackets if you use a
predicate to select only some of the <c> elements. But if you only
want the path, that for-each should do the job, I think.

Note that this sort of question is often easily answered on Dave
Pawson's FAQ pages. See
http://www.dpawson.co.uk/xsl/sect2/N6052.html#d9122e58. 

In XSL 1.0, how can I write out the XPATH expression for the
current context? Example:
<a>
  <b>
    <c />
    <c /> <!-- assume this is the context -->
    <c />
  </b>
</a>
Assuming <c/> is the current context I would like to determine the
xpath pattern like this: /a/b/c
How is this possible? I get how I could walk parent;;node() but I'd
be writing the pattern backwards! Any ideas?

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>