Re: [xsl] Test character immediately preceding node

Subject: Re: [xsl] Test character immediately preceding node
From: David Sewell <dsewell@xxxxxxxxxxxx>
Date: Tue, 8 Oct 2013 17:12:50 -0400 (EDT)
One strategy in XSLT 2.0 would be to test for the existence of a space at the end of the preceding node and add a space if it's not there:

   <xsl:template match="unittitle">
      <xsl:copy><xsl:apply-templates/></xsl:copy>
   </xsl:template>

   <xsl:template match="unitdate">
      <xsl:choose>
         <xsl:when test="preceding-sibling::node()[1][matches(., '\s$')]">
            <xsl:value-of select="."/>
         </xsl:when>
         <xsl:otherwise>
            <xsl:value-of select="concat(' ', .)"/>
         </xsl:otherwise>
      </xsl:choose>
   </xsl:template>

which will give you

   <unittitle>Statements 2001</unittitle>
   <unittitle>Statements 2001</unittitle>

but the following should accomplish the same thing with more concision and is more robust as it will handle multiple spaces before <unitdate> if they occur:

   <xsl:template match="unittitle">
      <xsl:copy>
         <xsl:value-of select="string-join((normalize-space(text()), unitdate), ' ')"/>
      </xsl:copy>
   </xsl:template>

DS

On Tue, 8 Oct 2013, Nathan Tallman wrote:

Is it possible to test a character immediately preceding a node? I
have an element with child-elements, my trouble is that sometimes
there is a space before the child-element, sometimes not. For example
I might have:

<unittitle>Statements <unitdate>2001</unitdate></unittitle>
or
<unittitle>Statements<unitdate>2001</unitdate></unittitle>

The XSLT that I'm forking from has instructions to insert a space
before <unitdate>, which sometimes results in two spaces in the
output. I'd like to use an xsl:choose to test for a space immediately
preceding <unitdate>. Is this possible? I'm using XSLT 2.0.

Thanks,
Nathan



-- David Sewell, Editorial and Technical Manager ROTUNDA, The University of Virginia Press PO Box 400314, Charlottesville, VA 22904-4314 USA Email: dsewell@xxxxxxxxxxxx Tel: +1 434 924 9973 Web: http://rotunda.upress.virginia.edu/

Current Thread