Re: [xsl] Novice Question - matching entire text children

Subject: Re: [xsl] Novice Question - matching entire text children
From: Wendell Piez <wapiez@xxxxxxxxxxxxxxxx>
Date: Tue, 21 Dec 2010 12:18:14 -0500
Hermann,

On 12/21/2010 9:11 AM, Hermann Stamm-Wilbrandt wrote:
As already stated this makes a difference for mixed content.
Take this simple XML file as sample:

$ cat mixed.xml
<a>  1<b>2</b>3</a>
$

While string(/a) returns a string, /a/text() returns a node-set:
$ xpath++ "string(/a)" mixed.xml
  123
$ xpath++ "/a/text()" mixed.xml

###################################################################
  1
###################################################################
3
$

This makes a big difference if applying the often used normalize-space()
function to the result. If you want to get the normalized concatenation
of the content ("123"/"13") directly applying normalize-space() does not
work (for "13"). The reason is that normalize-space() applied to a node-set
will only be applied to the first node of that node-set:
$ xpath++ "normalize-space(string(/a))" mixed.xml
123
$ xpath++ "normalize-space(/a/text())" mixed.xml
1
$

What I do for getting "13" from mixed.xml:
<xsl:variable name="txt"><xsl:copy-of select="text()"/></xsl:variable>
<xsl:value-of select="normalize-space($txt)"/>

Not sure whether this is the best way to do it, but it works.

Is getting the same result possible in XPath (1.0)?

"normalize-space(text())" will do the same without copying the text nodes into the variable first, if that's what you're asking.


But as David and others keep reminding us, what we usually want is actually "normalize-space(.)" i.e. "normalize-space(self::node())", which does not drop the values of any descendant elements (so "123" not "13").

In fact, when I am faced with the need to get "13" from "<e>1<f>2</f>3</e>", I'm probably also thinking badly of the XML designer, since prima facie it would appear to violate one of the unwritten patterns of XML design, namely "discrete data points should be designated by discrete elements". Not that there aren't always exceptions, of course. But either 1 and 3 belong together without 2, or they don't.

Cheers,
Wendell

======================================================================
Wendell Piez                            mailto:wapiez@xxxxxxxxxxxxxxxx
Mulberry Technologies, Inc.                http://www.mulberrytech.com
17 West Jefferson Street                    Direct Phone: 301/315-9635
Suite 207                                          Phone: 301/315-9631
Rockville, MD  20850                                 Fax: 301/315-8285
----------------------------------------------------------------------
  Mulberry Technologies: A Consultancy Specializing in SGML and XML
======================================================================

Current Thread