Subject: RE: [xsl] Copying parent nodes with different selection of their content From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Wed, 25 Apr 2007 16:13:50 +0100 |
Perhaps something like this: <xsl:for-each select="Document/*[starts-with(name(), 'Make-Toute-Seul')]"/> <Document> <xsl:copy-of select="../* except ."/> </Document> </xsl:for-each> Michael Kay http://www.saxonica.com/ > -----Original Message----- > From: Abel Braaksma [mailto:abel.online@xxxxxxxxx] > Sent: 25 April 2007 15:53 > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: [xsl] Copying parent nodes with different selection > of their content > > Hi List, > > This should be a really easy thing to do, I'm sure, but I'm > having a blank spot today when it comes to XSLT, it seems. > Perhaps some imperative twist in my mind stops me from > writing down a straight solution (or I just never encountered > the problem before, but I couldn't find it in my own archive). > > Basically, I have the solution, but it is so awkward that I > am sure that "there is a better way", esp. with XSLT. Take > the dataset (see variable $copy-me in the XSLT sample) and > consider a copy of the Document node for each > Make-Toute-Seul-X node, without the other Make-Toute-Seul-X > nodes. The result of the transformation is this (see the > similar data, with changing Make-Toute-Seul-X elements): > > (The original data is a SOAP envelope, and the envelope needs > to be copied a couple of times for each occurrence of some > node, which triggers a document in 'real' life) > > OUTPUT: > <Header> > <Meta/> > </Header> > <Body> > <Document> > <Preceding-1/> > <Preceding-2/> > <Make-Toute-Seul-1/> > <Following-1/> > <Following-2/> > </Document> > <Document> > <Preceding-1/> > <Preceding-2/> > <Make-Toute-Seul-2/> > <Following-1/> > <Following-2/> > </Document> > <Document> > <Preceding-1/> > <Preceding-2/> > <Make-Toute-Seul-3/> > <Following-1/> > <Following-2/> > </Document> > </Body> > > > > The XSLT looks like this and can be run on itself (I had > other incarnations, equally bad, anybody with a nicer > solution that feels more like 'XSLT'?). I'd like to move the > duplicated logic about the nodes Make-Toute-Seul-X to a > single location, to make maintenance a breeze. > > > <xsl:stylesheet > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> > > <xsl:output indent="yes" /> > > <xsl:variable name="copy-me"> > <Header> > <Meta /> > </Header> > <Body> > <Document> > <Preceding-1 /> > <Preceding-2 /> > <Make-Toute-Seul-1 /> > <Make-Toute-Seul-2 /> > <Make-Toute-Seul-3 /> > <Following-1 /> > <Following-2 /> > </Document> > </Body> > </xsl:variable> > > > <xsl:template match="/"> > <xsl:apply-templates select="$copy-me/*"/> > </xsl:template> > > <xsl:template match="Body"> > <xsl:copy> > <xsl:apply-templates select="*[Make-Toute-Seul-1]" > > <xsl:with-param name="seul" > select="*/Make-Toute-Seul-1" > tunnel="yes" /> > </xsl:apply-templates> > <xsl:apply-templates select="*[Make-Toute-Seul-2]" > > <xsl:with-param name="seul" > select="*/Make-Toute-Seul-2" > tunnel="yes" /> > </xsl:apply-templates> > <xsl:apply-templates select="*[Make-Toute-Seul-3]" > > <xsl:with-param name="seul" > select="*/Make-Toute-Seul-3" > tunnel="yes" /> > </xsl:apply-templates> > </xsl:copy> > </xsl:template> > > <xsl:template match="Document"> > <xsl:param name="seul" tunnel="yes"/> > <xsl:copy> > <xsl:copy-of > select="$seul/preceding-sibling::*[not(self::Make-Toute-Seul-1 | > self::Make-Toute-Seul-2 | self::Make-Toute-Seul-3)]" /> > <xsl:copy-of select="$seul" /> > <xsl:copy-of > select="$seul/following-sibling::*[not(self::Make-Toute-Seul-1 | > self::Make-Toute-Seul-2 | self::Make-Toute-Seul-3)]" /> > </xsl:copy> > </xsl:template> > > <xsl:template match="* | @*"> > <xsl:copy> > <xsl:apply-templates select="node() | @*" /> > </xsl:copy> > </xsl:template> > </xsl:stylesheet> > > > > > Thanks for any help, > > Cheers, > > Abel
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Copying parent nodes with, Abel Braaksma | Thread | Re: [xsl] Copying parent nodes with, Abel Braaksma |
[xsl] Endless loop in xsltExtension, Stephan Suerken | Date | [xsl] (newbie) Need DOCTYPE command, Glen Mazza |
Month |