xsl-list
[Top] [All Lists]

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

2009-10-28 15:53:13
Mario Madunic wrote:
I have the following element (I'm using Saxon9 and XSLT2)

<p>Crazing – 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 – (space en dash 
space) and only the first  – (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="(.*) – (.*)">
        <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/

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--