Re: [xsl] nodes() before and after a string delimiter

Subject: Re: [xsl] nodes() before and after a string delimiter
From: Martin Honnen <Martin.Honnen@xxxxxx>
Date: Wed, 28 Oct 2009 20:52:36 +0100
Mario Madunic wrote:
I have the following element (I'm using Saxon9 and XSLT2)

<p>Crazing b Hairline cracking of the resin, giving it an opaque, <q>frosty</q> appearance.</p>

I need to break it into two halves like the following based on the b (space en dash space) and only the first b (space en dash space).

<p>
   <term>Crazing</term>
   <definition>Hairline cracking of the resin, giving it an opaque, <q>frosty</q> appearance.</definition>
</p>

This stylesheet


<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
  version="2.0">

<xsl:output indent="yes"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="p">
    <xsl:copy>
      <xsl:variable name="this" select="."/>
      <xsl:variable name="t" select="text()[1]"/>
      <xsl:analyze-string select="$t" regex="(.*) b (.*)">
        <xsl:matching-substring>
          <term><xsl:value-of select="regex-group(1)"/></term>
          <definition>
            <xsl:value-of select="regex-group(2)"/>
            <xsl:apply-templates select="$t/following-sibling::node()"/>
          </definition>
        </xsl:matching-substring>
        <xsl:non-matching-substring>
          <xsl:apply-templates select="$this/node()"/>
        </xsl:non-matching-substring>
      </xsl:analyze-string>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

does that but I have not tested against anything but your input sample.
--

	Martin Honnen
	http://msmvps.com/blogs/martin_honnen/

Current Thread