Re: [xsl] problem with transforming mixed content

Subject: Re: [xsl] problem with transforming mixed content
From: "Graydon graydon@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Sat, 15 Aug 2020 02:34:12 -0000
On Sat, Aug 15, 2020 at 02:16:04AM -0000, Wolfhart Totschnig wolfhart.totschnig@xxxxxxxxxxx scripsit:
> <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>

<xsl:template match="title">
    <title>
      <xsl:sequence select="serialize(node()) => substring-before(':') => lower-case() => parse-xml-fragment()" />
    </title>
    <subtitle>
      <xsl:sequence select="serialize(node()) => substring-after(':') => lower-case() => parse-xml-fragment()" />
    </subtitle>
  </xsl:template>

gives

<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>

That's XSLT 3.0, it assumes there's always a colon, and could be made
rather more robust, but that's the general idea; treat the contents of
the element as a string sometimes and as nodes sometimes.

-- 
Graydon Saunders  | graydonish@xxxxxxxxx
^fs oferiode, pisses swa mfg.
-- Deor  ("That passed, so may this.")

Current Thread