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

Subject: Re: [xsl] Novice Question - matching entire text children
From: Hermann Stamm-Wilbrandt <STAMMW@xxxxxxxxxx>
Date: Tue, 21 Dec 2010 15:11:43 +0100
(fourth try to send this email to xsl-list, this time without reply)

> In any case, it's a good idea to make sure that your code still works if
> someone puts a comment in the middle of the text, so it's best not to
> assume that all the text of an element is in a single node. Usually the
> best way of doing that (unless you are dealing with mixed content) is to
> use the string-value of the element node, rather than its text node
> children.

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)?


Mit besten Gruessen / Best wishes,

Hermann Stamm-Wilbrandt
Developer, XML Compiler, L3
Fixpack team lead
WebSphere DataPower SOA Appliances
----------------------------------------------------------------------
IBM Deutschland Research & Development GmbH
Vorsitzender des Aufsichtsrats: Martin Jetter
Geschaeftsfuehrung: Dirk Wittkopp
Sitz der Gesellschaft: Boeblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294

Current Thread