Thank you very much, Graydon and Dimitre, for your replies! Your
solutions work very well and deepened my understanding of XSLT.
There is just one little problem I encountered: The data of the external
source comes in a particular namespace. Since I do not want to have the
namespace declaration in the output, I use @exclude-result-prefixes in
the <xsl:stylesheet> element, which works as expected for the rest of
the output produced by my stylesheet and also for the <title> and
<subtitle> elements produced by your solutions. However, on the <i>
elements, the namespace declaration suddenly shows up, which baffles me.
Do you know why that is? And how do I get rid of it?
Best,
Wolfhart
On 14.08.20 23:08, Dimitre Novatchev dnovatchev@xxxxxxxxx wrote:
> XSLT 2.0:
>
> <xsl:stylesheet version="2.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
> B <xsl:output omit-xml-declaration="yes" indent="yes"/>
>
> B B <xsl:template match="node()|@*" mode="copy-lowercase">
> B B <xsl:copy>
> B B B <xsl:apply-templates select="node()|@*" mode="#current"/>
> B B </xsl:copy>
> B </xsl:template>
>
> B <xsl:template match="title/text()[contains(., ':')]">
> B B <title>
> B B B <xsl:apply-templates select="preceding-sibling::node()"
> mode="copy-lowercase"/>
> B B B <xsl:copy-of select="lower-case(substring-before(., ':'))"/>
> B B </title>
> B B <subtitle>
> B B B <xsl:copy-of select="lower-case(substring-after(., ':'))"/>
> B B B <xsl:apply-templates select="following-sibling::node()"
> mode="copy-lowercase"/>
> B B </subtitle>
> B </xsl:template>
>
> B <xsl:template match="text()"/>
>
> B <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
> B B <i>ITALICS</i> AND SOME MORE
> WORDS: THE SUBTITLE OF THE BOOK WITH SOME
> B B <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>
>
> B --
> Cheers,
> Dimitre Novatchev
>
>
> On Fri, Aug 14, 2020 at 7:16 PM Wolfhart Totschnig
> wolfhart.totschnig@xxxxxxxxxxx <mailto:wolfhart.totschnig@xxxxxxxxxxx>
> <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx
> <mailto: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
>
>
>
> XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list>
> EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/2652055>
> (by email <>)
|