RE: [xsl] hard xsl problem

Subject: RE: [xsl] hard xsl problem
From: "Michael Kay" <mhk@xxxxxxxxx>
Date: Mon, 26 Jul 2004 11:10:28 +0100
Handling implicit structure is always easier in XSLT 2.0, though this one is
still a little tricky.

I would do a first pass in which all the "(" characters (and preceding
whitespace) are replaced by <lpar/> and all the ")" (and following
whitespace) are replaced by <rpar/>. This is easily done in 2.0 using
xsl:analyze-string.

<xsl:template match="text()">
  <xsl:analyze-string select="." regex="(\s*\()|(\)\s*)">
    <xsl:matching-substring>
      <xsl:choose>
        <xsl:when test="contains(.,'(')><lpar/></xsl:when>
        <xsl:otherwise><rpar/></xsl:otherwise>
      </
    </
  </
</
      

Then in a second pass, use:

<xsl:for-each-group group-starting-with="lpar|rpar">
  <xsl:if test="self::rpar">
    <xsl:copy-of select="current-group() except ."/>
  </
</

Not tested.

Michael Kay

> -----Original Message-----
> From: Richard Bondi [mailto:rbondi@xxxxxxxxx] 
> Sent: 26 July 2004 00:10
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] hard xsl problem
> 
> I would be grateful for a solution to the following xsl problem.
> 
> Example input:
> ==============
> <Paragraph> On October 30, clad in scarlet and ermine, Charles made
> his entry into the papal palace (see <i>especially<i> <cite>30</cite>,
> as well as <cite>20</cite>). He presented the Pope with a blue velvet
> cape embroidered in pearls (<cite>234</cite>; <cite>12345</cite>) in a
> design of angels (as well as a fleur-de-lys and stars). With no
> footing except in French support, Clement's papacy would have vanished
> in smoke.</Paragraph>
> 
> Example output:
> ==============
> <Paragraph> On October 30, clad in scarlet and ermine, Charles made
> his entry into the papal palace. He presented the Pope with a blue
> velvet cope embroidered in pearls in a design of angels (as well as a
> fleur-de-lys and stars). With no footing except in French support,
> Clement's papacy would have vanished in smoke.</Paragraph>
> 
> Problem in words:
> ==============
> The <cite> tags are always enclosed in parenthesis. As the result of a
> transform (when a parameter passed into the xsl sheet is 'true') (a)
> these parens, (b) their xml content, and (c) the space preceding the
> open paren must be suppressed. Alternatively, (a)-(c) can be enclosed
> in a tag. Parens that do not contain <cite> tags are to be left as is.
> All of this is always inside a <Paragraph> tag.
> 
> How to do this is the problem.
> 
> I don't see how to do this even with a plugin, because it is unclear
> to me how a plugin can be used to generate tags. It would of course be
> more elegant to do this without a plugin.
> 
> MTIA,
> /r:b:

Current Thread