|
Subject: Re: [xsl] Re: XPath to select node according to xml:lang attribute From: Philipp Kursawe <phil.kursawe@xxxxxxxxx> Date: Sat, 16 Apr 2011 20:37:36 +0200 |
Thanks Wendell, I will try that! I think I have to go with the 1.0
version since Windows CE MSXML parser can only handle 1.0 expressions.
On Sat, Apr 16, 2011 at 12:37 AM, Wendell Piez <wapiez@xxxxxxxxxxxxxxxx>
wrote:
> Hi,
>
> On 4/15/2011 2:22 PM, Chris wrote:
>>
>> -----BEGIN PGP SIGNED MESSAGE-----
>> Hash: SHA1
>>
>> On 04/15/2011 02:18 PM, Philipp Kursawe wrote:
>>>
>>> Hmm I cannot use XSLT in my context. I can only use XPath. So I guess
>>> I would have to select "en-us" first and see if there is a result, if
>>> not select "en" and so on. Or could I "||" chain multiple XPath
>>> selects?
>>> //text[@id='color' and lang('en-us')] || //text[@id='color' and
>>> lang('en')] || //text[@id='color']
>>
>> Not sure what your context is... B You canbt put the || in an XPath, but
>> if youbre in some procedural language like Perl or Java, then yes.
>> Pseudocode:
>>
>> color_label = select( "//text[@id='color' and lang('en-us')]" ) ||
>> B B B B B B B select( "//text[@id='color' and lang('en')]" ) ||
>> B B B B B B B select( "//text[@id='color']" )
>>
>> That would (presuming normal behavior of logical or) get the best match
>> for you.
>
> Keep in mind, however, that what we have in XPath 1.0 "|" is a union
> operation, not an "or". So,
>
> //text[@id='color' and lang('en-us')] |
> //text[@id='color' and lang('en')] |
> //text[@id='color']
>
> will get us all the nodes in //text that have @id='color', irrespective of
> their lang() value, because the third term in the union collects them.
>
> To do a cascading conditional like this in XPath 1.0 alone generally
> requires building conditionals into the predicates, as in
>
> //text[@id='color'][
> B @xml:lang='en-us' or
> B (@xml:lang='en' and not(../@xml:lang='en-us') or
> B not(../@xml:lang='en-us' or../@xml:lang='en')] ]
>
> where the fallback cases (the second and third operands of the boolean 'or'
> here) are excluded by filtering themselves out when the preferred cases are
> available.
>
> Here the attribute values are tested directly since the lang() function
> works only on the context node, and we have to test the siblings. (So we
> have to do without the case-insensitive test built into lang().)
>
> This is easier in XPath 2.0, where we can do something like
>
> //text[@id='color]/(.[lang('en-us')],.[lang('en')],.)[1]
>
> Cheers,
> Wendell
>
> ======================================================================
> Wendell Piez B B B B B B B B B B B B B
B mailto:wapiez@xxxxxxxxxxxxxxxx
> Mulberry Technologies, Inc. B B B B B B B
B http://www.mulberrytech.com
> 17 West Jefferson Street B B B B B B B B B B Direct Phone:
301/315-9635
> Suite 207 B B B B B B B B B B B B B B B B B B B B
B Phone: 301/315-9631
> Rockville, MD B 20850 B B B B B B B B B B B B B B B B Fax:
301/315-8285
> ----------------------------------------------------------------------
> B Mulberry Technologies: A Consultancy Specializing in SGML and XML
> ======================================================================
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] Re: XPath to select node , Wendell Piez | Thread | Re: [xsl] Re: XPath to select node , Wendell Piez |
| Re: [xsl] Re: XPath to select node , Wendell Piez | Date | Re: [xsl] Select a node only if its, Philipp Kursawe |
| Month |