RE: [xsl] XPath to match attribute with multiple values...?

Subject: RE: [xsl] XPath to match attribute with multiple values...?
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Wed, 10 Nov 2004 19:05:30 -0000
In 2.0 if you have a schema that describes the attribute as list-valued then

  contains(@categories, "business")

will do the right thing.

If you don't have a schema, then

  contains(tokenize(@categories, '\s'), "business")

will do the right thing.

With 1.0, it's much harder.

Michael Kay
http://www.saxonica.com/
 

> -----Original Message-----
> From: Emmanouil Batsis [mailto:Emmanouil.Batsis@xxxxxxxxxxx] 
> Sent: 10 November 2004 19:03
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: [xsl] XPath to match attribute with multiple values...?
> 
> Matt Dittbenner wrote:
> 
> > Let me show another example.....
> >
> > <package name="product1" categories="personal small_business"/>
> > <package name="product2" categories="business enterprise" />
> >
> > In this example I want to match packages that belong to the 
> category 
> > "business" exclusively (not including small business). Using the 
> > contains function will return both product1 and product2, 
> which is not 
> > the data I am looking for.
> 
> 
> Ahhhh, right; sorry for the too-quick reply. I guess you need 
> to work a 
> little more by matching the nodes with contains, then 
> validating them in 
> a template with the substring functions. Check out
> 
> http://www.w3.org/TR/xpath#section-String-Functions
> 
> for reference. Dunno if an extention exists for what you want (ie 
> match-word or something), but i guess it checking out EXSLT would not 
> take too much time.
> 
> hth,
> 
> Manos
> 
> >
> > Thanks for such fast responses!
> >
> > Emmanouil Batsis wrote:
> >
> >> An attribute value is atomic. You can look whether it contains a 
> >> substring using the contains(a, b) function. It will 
> return true if a 
> >> contains b.
> >>
> >> hth,
> >>
> >> MAnos
> >>
> >> Matt Dittbenner wrote:
> >>
> >>> Hey there,
> >>>
> >>> I am having trouble finding any information on this. I 
> have some XML 
> >>> data with an attribute that has a space-delimited list 
> inside of it 
> >>> (kind of like putting multiple classes on an element in 
> html for use 
> >>> by CSS). How can I use XPath to match the nodes with 
> attributes that 
> >>> contain a specific value. I think the best way to describe this 
> >>> would be with an example:
> >>>
> >>> <data>
> >>>    <item name="a" attribute="value value1"/>
> >>>    <item name="b" attribute="value2 value1"/>
> >>>    <item name="c" attribute="value1 value3"/>
> >>>    <item name="d" attribute="value"/>
> >>> </data>
> >>>
> >>> If I want to match the elements where "attribute" has one of its 
> >>> values "value1", I want item "a", item "b" and item "c". But if I 
> >>> want the elements where "attribute" has one of its values 
> "value", I 
> >>> should get item "a" and item "d". If you use the 
> contains() string 
> >>> function, you would obviously match all items, which is 
> not what I 
> >>> want.
> >>>
> >>> As I said before CSS allows you to create styles that apply to a 
> >>> class, and on your html, you can just set class="class1 class2 
> >>> class3". That way ".class1", ".class2", ".class3", and 
> >>> ".class1.class2" are all separate styles! I don't need 
> this extent 
> >>> of functionality, but it leads me to believe something like this 
> >>> just might exist in XPath.
> >>>
> >>> Any ideas?
> >>>
> >>> Thanks in advance,
> >>>    Matt

Current Thread