Re: [xsl] Tokenizing mixed content

Subject: Re: [xsl] Tokenizing mixed content
From: "Edward Porter edward.porter@xxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Mon, 20 May 2019 13:24:04 -0000
Thanks, Martin. This is exactly what I needed to get started. I think I can
massage the punctuation after replacing the pipes for choice elements.

-----Original Message-----
From: Martin Honnen martin.honnen@xxxxxx
Sent: Friday, May 17, 2019 9:41 AM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re: [xsl] Tokenizing mixed content


On 17.05.2019 15:29, Martin Honnen martin.honnen@xxxxxx wrote:
> On 17.05.2019 15:22, Edward Porter edward.porter@xxxxxxx wrote:
>> I am working on a conversion script transforming from a prior DTD to
>> a new DTD, and as part of this transformation, we are hoping to parse
>> some mixed content into separate nested elements. The content is "|"
>> delimited, but I am having a tough time coming up with a way to group
>> the text and sibling elements. What follows are some permutations of
>> input and expected output:

>> I've got access to XSL 2, and possibly XSL3 if necessary.
> A two pass transformation that first processes text nodes to "convert"
> the pipe character into an element (e.g. <pipe/>) and then in second
> step uses for-each-group group-ending-with="pipe" should help.

Along the lines of

<xsl:stylesheet xmlns:xsl="";

   <xsl:mode on-no-match="shallow-copy"/>

   <xsl:mode name="pipe-char-to-pipe-el" on-no-match="shallow-copy"/>

   <xsl:mode name="analyze-string"/>

   <xsl:template match="text()" mode="pipe-char-to-pipe-el">
       <xsl:apply-templates select="analyze-string(., '\s*\|\s*')"

   <xsl:template match="fn:match" mode="analyze-string">

   <xsl:variable name="first-pass-result">
       <xsl:apply-templates mode="pipe-char-to-pipe-el"/>

   <xsl:template match="/">
       <xsl:apply-templates select="$first-pass-result/node()"/>

   <xsl:template match="argument">
           <xsl:for-each-group select="node()" group-ending-with="pipe">
                   <xsl:apply-templates select="current-group()"/>

   <xsl:template match="pipe"/>


Not sure when/where the quotes in the first example need to be eliminated.

Current Thread