[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

RE: transforming based on implicit cross-references

Subject: RE: transforming based on implicit cross-references
From: Syd Bauman <Syd_Bauman@xxxxxxxxx>
Date: Mon, 21 Dec 2009 08:26:03 -0500
RE:  transforming based on implicit cross-references
Hmmm ... my validator tells me that a variable is not allowed in the
value of a match= attribute in XSLT 1.0, and my reading of
http://www.w3.org/TR/xslt#patterns supports that.

So I tried a slightly different crack at this problem. I think the
following does what OP (Ed Fair?) wants. I've annotated it, both in
the hopes that the annotations are helpful to OP and others
interested in how to do this sort of thing, and so that the real
experts on this list might be able to point out any errors (unlikely)
or silly methodology (likely) I've employed, or explain things


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:output method="xml" indent="yes"/>
  <xsl:param name="personOfInterest">Anna</xsl:param>

  <!-- match root, start generating output tree -->
  <xsl:template match="/">
      <!-- since OP didn't say how deep in the input tree -->
      <!-- <timestamp> elements are buried, just pick out -->
      <!-- all descendant <timestamp>s and process -->
      <xsl:apply-templates select="//timestamp"/>

  <xsl:template match="timestamp">
    <!-- spit out the actual time stamp [I find this data structure -->
    <!-- fragile and scary, but it's what OP had in the input, so ...] -->
    <xsl:variable name="timestamp" select="text()[1]"/>
    <!-- select my descendant<person> element of interest, if any, and -->
    <!-- make it the current node (or is that context node?) -->
    <xsl:for-each select="people/person[normalize-space(.) = $personOfInterest]">
      <!-- Now that I have it (the right <person> node), I want to know its  -->
      <!-- position within the set of input <person> nodes. I can't use -->
      <!-- position(), though, as I'm now processing a little sub-tree that -->
      <!-- has only this 1 node (OP said there will always be at most one node -->
      <!-- that matches a person's name), so position() will always be 1 -->
      <xsl:variable name="position" select="count( preceding-sibling::person ) + 1"/>
      <!-- spit out an output <timestamp> with ... -->
        <!-- ... a copy of the input time stamp, and ... -->
        <xsl:apply-templates select="$timestamp"/>
        <!-- ... a copy of the element I'm looking at (a <person>) ... -->
          <!-- ... with the content of the element I'm looking at -->
          <xsl:value-of select="."/>
        <!-- Now process the corresponding <location> for this person -->
        <xsl:apply-templates select="following-sibling::locations/location[position() = $position]"/>

  <!-- template will only be triggered for the 1 location that has the same ordinality -->
  <!-- as the <person> we've found, so ... -->
  <xsl:template match="location">
    <!-- ... just generate a copy of element & its data content -->
      <xsl:value-of select="."/>


 Syd Bauman, EMT-Paramedic
 Senior XML Programmer/Analyst
 Brown University Women Writers Project
 Syd_Bauman@xxxxxxxxx      401-863-3835

Current Thread


Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
First Name
Last Name
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.