Re: [xsl] not matching empty text nodes.

Subject: Re: [xsl] not matching empty text nodes.
From: Joerg Heinicke <joerg.heinicke@xxxxxx>
Date: Sun, 09 Feb 2003 09:38:46 +0100
Hi Terence,

Terence wrote:
Ross Ken wrote:

Try

xsl:template match="/album/photos/photo/caption[text()!='']"

This works very well :-)

The only problem is, some of the non-empty text nodes are nothing but
whitespace.

to fix the problem I did this.

xsl:template match="photo/*[text()!=''][count(*)=0]"

When this works like expected, then only because you have only something like


<photo>
  <anyelement>
    text
  </anyelement>
</photo>

(matching)

and

<photo>
  <anyelement>
    <anotherelement/>
  </anyelement>
</photo>

(not matching)

It won't match on

<photo>
  <anyelement>
    text
    <anotherelement/>
  </anyelement>
</photo>

(text is != '', but count(*) is 1 (<anotherelement/>))

Maybe it already matches your needs, but I think it's better to use

xsl:template match="photo/*[normalize-space()]"

(strips whitespace characters)

Regards,

Joerg

That's because all the text nodes I want to capture don't have any other
sub-elements (ie. it's plain text, not markup).

I tried using <xsl:strip-space elements="*" />
but it seemed to have no effect on the sablotron processor.


and


<xsl:template match="/album/photos/photo/*[text()!='']">
<tr valign="top">
<td class="label" align="right"><xsl:value-of select="name()"/>:</td>
<td class="caption"><xsl:value-of select="." /></td>
</tr>
</xsl:template>


This works a treat :-)

Thanks. Most helpfull indeed.

I've made several modifications based on a similar thing.

    <xsl:template match="photo/*[text()!=''][count(*)=0]">
        <tr valign="top">
            <td class="label" align="right"><xsl:value-of
select="name()"/>:</td>
            <td class="{name()}"><xsl:value-of select="." /></td>
        </tr>
    </xsl:template>

    <xsl:template match="photo/*[@name!='']">
        <tr valign="top">
            <td class="label" align="right"><xsl:value-of
select="name()"/>:</td>
            <td class="{name()}"><xsl:value-of select="@name" /></td>
        </tr>
    </xsl:template>

    <xsl:template match="photo/*[@year!='']">
        <tr valign="top">
            <td class="label" align="right"><xsl:value-of
select="name()"/>:</td>
            <td class="{name()}">
                <xsl:value-of select="@day" />/<xsl:value-of
select="@month" />/<xsl:value-of select="@year" /> -
                <xsl:value-of select="@hour" />:<xsl:value-of
select="@min" />
            </td>
        </tr>
    </xsl:template>

This has reduced the size of my sheet signifigantly and there is less
modification in the event of a schema change.


XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list


Current Thread