Subject: Re: [xsl] [xslt] xslt problem From: Michalmas <michalmas@xxxxxxxxx> Date: Thu, 19 Mar 2009 15:22:52 +0100 |
Hi, one more question - how to enhance the condition in template to check if among the children nodes there is <test> node. So, it should work for: <interestingNode> <con>someString</con> <follow> <node1>1</node1> <test>2</test> <!-- HERE we have required node --> <node3>3</node3> <node4>4</node4> </follow> <space>5</space> </interestingNode> but not for: <interestingNode> <con>someString</con> <follow> <node1>1</node1> <node2>2</node2> <node3>3</node3> <node4>4</node4> </follow> <space>5</space> </interestingNode> thanks! On Thu, Mar 19, 2009 at 10:20 AM, Ronan Klyne <ronan.klyne@xxxxxxxxxxx> wrote: > 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> >> B <someNode> >> B B B B B <value>asas</value> >> B B B B B <name>asas</name> >> B B B B B <space>12</space> >> B </someNode> >> B <interestingNode> >> B B B B B <con>someString</con> >> B B B B B <follow> >> B B B B B B B B B <return>0</return> >> B B B B B </follow> >> B B B B B <space>5</space> >> B </interestingNode> >> >> B <node1 space="12">1</node1> <!-- HERE space attribute B --> >> B <node2 space="12">2</node2> >> B <node3 space="12">3</node3> >> B <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"> > B <xsl:apply-templates/> > </xsl:template> > > <xsl:template match="interestingNode[con='someString']"> > B <interestingNode> > B B <xsl:copy-of select="con" /> > B B <follow> > B B B <return>0</return> > B B </follow> > B B <xsl:copy-of select="space" /> > B </interestingNode> > B <xsl:variable name="space" > select="preceding-sibling::*[space]/space[1]" /> > B <xsl:for-each select="follow/*"> > B B <xsl:copy> > B B B <xsl:attribute name="space" select="$space" /> > B B B <xsl:copy-of select="node()" /> > B B </xsl:copy> > B </xsl:for-each> > </xsl:template> > > <xsl:template match="*"> > B <xsl:copy-of select="." /> > </xsl:template> > > </xsl:stylesheet> > > > >> On Thu, Mar 19, 2009 at 10:00 AM, Michael Kay <mike@xxxxxxxxxxxx> wrote: >>> Not the most imaginative title for a post. >>> >>>> <example> >>>> B B <someNode> >>>> B B B B B B <value>asas</value> >>>> B B B B B B <name>asas</name> >>>> B B B B B B <space>12</space> >>>> B B </someNode> >>>> B B <interestingNode> >>>> B B B B B B <con>someString</con> >>>> B B B B B B <follow> >>>> B B B B B B B B B B <node1>1</node1> >>>> B B B B B B B B B B <node2>2</node2> >>>> B B B B B B B B B B <node3>3</node3> >>>> B B B B B B B B B B <node4>4</node4> >>>> B B B B B B </follow> >>>> B B B B B B <space>5</space> >>>> B B </interestingNode> >>>> </example> >>>> >>>> >>>> Now i want to transform it to: >>>> >>>> <example> >>>> B B <someNode> >>>> B B B B B B <value>asas</value> >>>> B B B B B B <name>asas</name> >>>> B B B B B B <space>12</space> >>>> B B </someNode> >>>> B B <interestingNode> >>>> B B B B B B <con>someString</con> >>>> B B B B B B <follow> >>>> B B B B B B B B B B <return>0</return> >>>> B B B B B B </follow> >>>> B B B B B B <space>5</space> >>>> B B </interestingNode> >>>> >>>> B B <node1 space="5">1</node1> >>>> B B <node2 space="5">2</node2> >>>> B B <node3 space="5">3</node3> >>>> B B <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: >>>> B B - evrything in follow node is moved outside interestingNode >>>> B B - follow node gets one child return >>>> B B - 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']"> >>> B <xsl:copy> >>> B B <xsl:copy-of select="con"/> >>> B B <follow><return>0</return></follow> >>> B B <xsl:copy-of select="space"/> >>> B </xsl:copy> >>> B <xsl:variable name="space" select="space"/> >>> B <xsl:for-each select="follow/*"> >>> B B <xsl:copy> >>> B B B <xsl:attribute name="space" select="$space"/> >>> B B B <xsl:copy-of select="child::node()"/> >>> B B </xsl:copy> >>> B </xsl:for-each> >>> </xsl:template> >>> >>> Michael Kay >>> http://www.saxonica.com/ >> >> > > > -- > Ronan Klyne > Business Collaborator Developer > Tel: +44 01189 028518 > ronan.klyne@xxxxxxxxxxx > www.groupbc.com
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] [xslt] xslt problem, Ronan Klyne | Thread | Re: [xsl] [xslt] xslt problem, Ronan Klyne |
RE: [xsl] Display link text as a hy, Michael Kay | Date | Re: [xsl] [xslt] xslt problem, Ronan Klyne |
Month |