Subject: Re: [xsl] problem with transforming mixed content From: "Dimitre Novatchev dnovatchev@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Sat, 15 Aug 2020 03:07:59 -0000 |
XSLT 2.0: <xsl:stylesheet version="2.0" xmlns:xsl=" http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:template match="node()|@*" mode="copy-lowercase"> <xsl:copy> <xsl:apply-templates select="node()|@*" mode="#current"/> </xsl:copy> </xsl:template> <xsl:template match="title/text()[contains(., ':')]"> <title> <xsl:apply-templates select="preceding-sibling::node()" mode="copy-lowercase"/> <xsl:copy-of select="lower-case(substring-before(., ':'))"/> </title> <subtitle> <xsl:copy-of select="lower-case(substring-after(., ':'))"/> <xsl:apply-templates select="following-sibling::node()" mode="copy-lowercase"/> </subtitle> </xsl:template> <xsl:template match="text()"/> <xsl:template match="title//text()" mode="copy-lowercase"><xsl:value-of select="lower-case(.)"/></xsl:template> </xsl:stylesheet> When applied on the provided XML document: <title>THE TITLE OF THE BOOK WITH SOME <i>ITALICS</i> AND SOME MORE WORDS: THE SUBTITLE OF THE BOOK WITH SOME <i>ITALICS</i> </title> the wanted result is produced: <title>the title of the book with some <i>italics</i> and some more words</title> <subtitle> the subtitle of the book with some <i>italics</i> </subtitle> -- Cheers, Dimitre Novatchev On Fri, Aug 14, 2020 at 7:16 PM Wolfhart Totschnig wolfhart.totschnig@xxxxxxxxxxx <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > Dear list, > > I would like to ask for your help with the following mixed-content > problem. I am receiving, from an external source, data in the following > form: > > <title>THE TITLE OF THE BOOK WITH SOME <i>ITALICS</i> AND SOME MORE > WORDS: THE SUBTITLE OF THE BOOK WITH SOME <i>ITALICS</i></title> > > What I would like to do is > 1) separate the title from the subtitle (i.e., divide the data at the > colon) and put each in a separate element node; > 2) all the while maintaining the <i> markup; > 3) and perform certain string manipulations on all of the text nodes; > for the purposes of this post, I will use the example of converting > upper-case to lower-case. > > So the desired output is the following: > > <title>the title of the book with some <i>italics</i> and some more > words</title> > <subtitle>the subtitle of the book with some <i>italics</i></subtitle> > > How can this be done? > > I know that I can perform string manipulations while maintaining the <i> > markup with templates, i.e., <xsl:template match="text()"/> and > <xsl:template match="i"/>. But in this case I do not know how to divide > the data at the colon. And I know that I can divide the data at the > colon with <xsl:value-of select="substring-before(.,': ')"/>, but then I > loose the <i> markup. So I am at a loss. > > Thanks in advance for your help! > Wolfhart
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] problem with transforming, Graydon graydon@xxxx | Thread | Re: [xsl] problem with transforming, Wolfhart Totschnig w |
Re: [xsl] problem with transforming, Graydon graydon@xxxx | Date | Re: [xsl] problem with transforming, Wolfhart Totschnig w |
Month |