xsl-list
[Top] [All Lists]

Re: [xsl] [xslt] xslt problem

2009-03-19 05:18:48
Michalmas wrote:
Hi guys,

I made small error in the example XMLs, actually the main problem i
had i skipped.

In the result XML, i need to get referance of attribute space of
previous node (something like preceding-sibling). If the previous node
doens't have it, i need to go further back until i find it or until
the beginning of XML.

Correct result XML would be:
<example>
  <someNode>
          <value>asas</value>
          <name>asas</name>
          <space>12</space>
  </someNode>
  <interestingNode>
          <con>someString</con>
          <follow>
                  <return>0</return>
          </follow>
          <space>5</space>
  </interestingNode>

  <node1 space="12">1</node1> <!-- HERE space attribute  -->
  <node2 space="12">2</node2>
  <node3 space="12">3</node3>
  <node4 space="12">4</node4>
</example>

The key difference here will be to use the xpath
'preceding-sibling::*[space]/space[1]' to pick the right space tag. The
logic here is as follows:
1) 'preceding-sibling::*' - get all preceding siblings of the current node
2) '[space]' - filter these to the ones with a 'space' child.
3) '/space[1]' - get the first 'space' child.

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>

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

<xsl:template match="interestingNode[con='someString']">
  <interestingNode>
    <xsl:copy-of select="con" />
    <follow>
      <return>0</return>
    </follow>
    <xsl:copy-of select="space" />
  </interestingNode>
  <xsl:variable name="space"
select="preceding-sibling::*[space]/space[1]" />
  <xsl:for-each select="follow/*">
    <xsl:copy>
      <xsl:attribute name="space" select="$space" />
      <xsl:copy-of select="node()" />
    </xsl:copy>
  </xsl:for-each>
</xsl:template>

<xsl:template match="*">
  <xsl:copy-of select="." />
</xsl:template>

</xsl:stylesheet>



On Thu, Mar 19, 2009 at 10:00 AM, Michael Kay <mike(_at_)saxonica(_dot_)com> 
wrote:
Not the most imaginative title for a post.

<example>
    <someNode>
            <value>asas</value>
            <name>asas</name>
            <space>12</space>
    </someNode>
    <interestingNode>
            <con>someString</con>
            <follow>
                    <node1>1</node1>
                    <node2>2</node2>
                    <node3>3</node3>
                    <node4>4</node4>
            </follow>
            <space>5</space>
    </interestingNode>
</example>


Now i want to transform it to:

<example>
    <someNode>
            <value>asas</value>
            <name>asas</name>
            <space>12</space>
    </someNode>
    <interestingNode>
            <con>someString</con>
            <follow>
                    <return>0</return>
            </follow>
            <space>5</space>
    </interestingNode>

    <node1 space="5">1</node1>
    <node2 space="5">2</node2>
    <node3 space="5">3</node3>
    <node4 space="5">4</node4>
</example>


The changes are:
- when interestingNode is found, we check the con value
- if con value conforms someString, then we make
transformation of this part by:
    - evrything in follow node is moved outside interestingNode
    - follow node gets one child return
    - all nodes moved outside get an attribute space with
value specified in original node

That seems to be a rule you can translate directly into XSLT:

<xsl:template match="interestingNode[con='someString']">
 <xsl:copy>
   <xsl:copy-of select="con"/>
   <follow><return>0</return></follow>
   <xsl:copy-of select="space"/>
 </xsl:copy>
 <xsl:variable name="space" select="space"/>
 <xsl:for-each select="follow/*">
   <xsl:copy>
     <xsl:attribute name="space" select="$space"/>
     <xsl:copy-of select="child::node()"/>
   </xsl:copy>
 </xsl:for-each>
</xsl:template>

Michael Kay
http://www.saxonica.com/


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



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




-- 
Ronan Klyne
Business Collaborator Developer
Tel: +44 01189 028518
ronan(_dot_)klyne(_at_)groupbc(_dot_)com
www.groupbc.com

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