[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

Re: [xsl] Find elements where any attribute contains alpha-numerical chars of an input string


Subject: Re: [xsl] Find elements where any attribute contains alpha-numerical chars of an input string
From: "G. Ken Holman" <gkholman@xxxxxxxxxxxxxxxxxxxx>
Date: Fri, 02 Nov 2012 21:56:25 -0400

At 2012-11-02 21:44 -0400, Graydon wrote:
On Fri, Nov 02, 2012 at 11:54:22PM +0100, Philipp Kursawe scripsit:
> I have this rather complex xpath:
>
> //element[@*[contains(translate(., translate(.,
> 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', ''),
> ''), translate('string', translate('string',
> 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', ''),
> ''))]]
>
> where "string" would be an input string with non-alpha chars and
> spaces and mixed letter cases.
> I would like to select any element whose attributes contain parts of
> the input string, stripped by non-alpha chars and whitespace.
>
> Problem is, the xpath does not work for mixed char input strings.

Wouldn't

//element[matches(@*,replace($string,'[\p{L}\p{Nd}]',''),'i')]

work?

Because of the cardinality of the first argument to matches(), not quite. It is expecting a singleton and you are supplying a sequence. You would have to restructure the expression and see if the following would satisfy the original poster's requirement:


//element[@*/matches(.,replace($string,'[\p{L}\p{Nd}]',''),'i')]

... remembering that:

$nodes/expression(.)

... is the same as:

for $n in $nodes return expression($n)

Thus, my replacement returns the sequence of Boolean values for the predicate.

Wait!! For a predicate, one cannot evaluate the effective Boolean value of a sequence of Boolean values, so I'm guessing now my first thought likely would not work.

So let's rewrite it as follows:

//element[@*[matches(.,replace($string,'[\p{L}\p{Nd}]',''),'i')]]

Now the data type of the predicate is a node set and there will be a non-empty node set of attribute nodes of the ones that satisfy the matches().

That would likely work better than my first thought. Assuming the matches() satisfies what the original poster wants.

I hope this helps. And I hope preserving my first mistaken thought is instructive, rather than just editing it out of my response.

. . . . . . . . . . Ken


-- Contact us for world-wide XML consulting and instructor-led training Free 5-hour lecture: http://www.CraneSoftwrights.com/links/udemy.htm Crane Softwrights Ltd. http://www.CraneSoftwrights.com/s/ G. Ken Holman mailto:gkholman@xxxxxxxxxxxxxxxxxxxx Google+ profile: https://plus.google.com/116832879756988317389/about Legal business disclaimers: http://www.CraneSoftwrights.com/legal


Current Thread
Keywords