xsl-list
[Top] [All Lists]

[xsl] xpath / multiple context question

2007-03-20 15:26:29
Xslt 2.0, xpath 2.0, Saxon 8B, XEP 4.4

I don't know an easy way to explain this, so please bear with me. I've scaled 
down dramatically, but it's still a little lengthy.

I have a layout xml file that tells me which data values to select and how to 
format the numeric values with respect to precision, whether to show the 
currency/percent sign, etc. In addition, the data values may be "wrapped" in 
text formatting instructions such as font, bold, etc. I use the information in 
the layout file with different matching modes to build the header, body, and 
footer of my output table. 

My problem is this: Once I select my xpath, resolve it to the actual value, and 
apply number formatting I need to traverse back up the tree to apply the text 
formatting to the formatted number.  I can't just apply-templates because I 
lose my specific context. 

Is there a way to build a result tree starting with the child element and 
working up to the parent/grandparent?

Scaled down Examples below - the complete files are at 
http://www.mwpoa.com/angela/xpathContextQuestion.html:

I apply fruit.xsl to fruit-layout.xml

Desired output:
<snip>
   <td>
     <p>
       <b>$123.00</b> <!--  HERE -->
     </p>
   </td>
</snip>

Actual output:
<snip>
   <td>
     <p>$123.00</p>
   </td>
</snip>

fruit-data.xml:
<?xml version="1.0" encoding="UTF-8"?>
<a>
  <b>
    <c>apple</c>
    <d>123.000000</d>
  </b>
</a>

fruit-layout.xml:
<?xml version="1.0" encoding="UTF-8"?>
<table>
  <data-set>
    <row-set xpath="doc('fruit-data.xml')/a/b" />
    <order-by xpath="doc('fruit-data.xml')/a/b/c" />
  </data-set>
  <columns>
    <column>
      <format>
        <type>currency</type>
        <precision>2</precision>
        <show-sign>first-and-last</show-sign>
      </format>
      <data-value>
        <bold>
          <xpath>doc('fruit-data.xml')/a/b/d</xpath>
        </bold>
      </data-value>
    </column>
  </columns>
</table>

fruit.xsl (abbreviated)
<xsl:stylesheet exclude-result-prefixes="#all" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"; 
  xmlns:fc="http://www.myfruit.com/fruit"; 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; 
  xmlns:sax="http://saxon.sf.net/"; 
  version="2.0">

  <snip>

  <xsl:template match="columns">
    <xsl:variable name="cols" select="." /> <!-- outer context -->
    
    <xsl:variable name="rows" as="xs:string">
      <xsl:value-of select="../data-set/row-set/@xpath" />
    </xsl:variable>

    <xsl:variable name="sort" as="xs:string">
      <xsl:value-of select="../data-set/order-by/@xpath" />
    </xsl:variable>

    <xsl:for-each select="sax:eval(sax:expression($rows))">
      <xsl:sort select="sax:eval(sax:expression(substring-after($sort, 
concat($rows, '/'))))" />

      <xsl:variable name="node" select="." /> <!-- data element context -->
      <tr>
        <xsl:for-each select="$cols/column">

          <td><p>
            <xsl:variable name="field">  <!-- value context -->
              <xsl:value-of select="data-value/descendant::xpath" />
            </xsl:variable>

            <xsl:variable name="amt" as="xs:string" 
select="$node/sax:evaluate(substring-after($field, concat($rows,'/')))" />

              <xsl:variable name="precision" as="xs:integer">
                <logic />
              </xsl:variable>
              
              <!-- The following line produces the child data value. 
                   How do I wrap this with the parent <b> element? -->
              <xsl:value-of 
select="fc:nbr-format(number($amt),$precision,'true','$')" />
          </p></td>

        </xsl:for-each>
      </tr>
    </xsl:for-each>
  </xsl:template>

  
  <xsl:template match="bold">
    <b>
      <xsl:apply-templates />
    </b>
  </xsl:template>

  <xsl:template match="xpath">
    <!-- This is where I need the child data value to print in the result tree.
         If I just match here, I lose the context and get ALL xpath values, when
         I only want the formatted child data value resolved in the columns 
template. 
         ?????
    -->
  </xsl:template>
</snip>

</xsl:stylesheet>


Thanks in advance!
Angela Williams
Channel Developer
The 401k Company - Austin, Texas
512-344-1547
  



--~------------------------------------------------------------------
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>