[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: Move elements to preceding parent
Israel Viente wrote:
My input is something like the following: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <body> <p dir="rtl"> <span class="chapter">line1</span> </p> <p dir="rtl"> <br /> <span class="regular">line3.</span> <span class="italic">line4</span> <span class="regular">line5."</span> </p> <p dir="rtl"> <br /> <span class="regular">line6.</span> <br /> <span class="regular">line7</span> </p> <p dir="rtl"> <br /> <span class="regular">line8.</span> <span class="regular">line9.</span> </p> </body> </html> Here is an attempt at solving that with XSLT 2.0: <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xpath-default-namespace="http://www.w3.org/1999/xhtml" version="2.0"> <xsl:output method="xhtml"/> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <xsl:template match="p[span[@class ne 'chapter'] and not(matches(span[@class ne 'chapter'][last()], '[.?"!]$'))]"> <xsl:copy> <xsl:apply-templates select="@* | node() | following-sibling::p[1]/node()"/> </xsl:copy> </xsl:template> <xsl:template match="p[preceding-sibling::p[1][span[@class ne 'chapter'] and not(matches(span[@class ne 'chapter'][last()], '[.?"!]$'))]]"/> </xsl:stylesheet> For the posted input using Saxon 9 it produces the described output but I have not tested with other inputs. -- Martin Honnen http://msmvps.com/blogs/martin_honnen/
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|