Subject: Re: [xsl] xslt 1.0 vs xslt 2.0 problem From: "Darcy Parker" <darcyparker@xxxxxxxxx> Date: Wed, 3 Sep 2008 13:41:08 -0400 |
Hi Mark, //A[ contains(B/@a, "foo") ] is going to return just A nodes that have B/@a with "foo" in it... so it should actually return <resp> <A> <B a="foo bar bar"></B> <B a="bar bar foo"></B> <B a="boo far far"></B> </A> <A> <B a="far boo"></B> <B a="foo bar foo"></B> <B a="bar foo bar"></B> </A> </resp> Because each of the A elements contain a B/@a with "foo" in it. If you just want <resp> <A> <B a="foo bar bar"></B> <B a="bar bar foo"></B> </A> <A> <B a="foo bar foo"></B> <B a="bar foo bar"></B> </A> </resp> Others correctly suggested //A[B[contains(@a, "foo")]] But this will still just select the same 2 AA elements with the B elements unchanged. I think you want to do something like: <xsl:for-each select=" //A[B[contains(@a, "foo")]]"> <A> <xsl:apply-templates select="B[contains(@a, "foo")]"/> </A> </xsl:for-each> This way you are selecting each of the desired A elements... and filtering out the B elements that do not have the correct @a values. Darcy On Wed, Sep 3, 2008 at 1:27 PM, mark bordelon <markcbordelon@xxxxxxxxx> wrote: > Dear Gents: > > I have looked everywhere for the solution to this problem and never seem to get what to the root of the issue. Here is the problem in a nutshell: > > I have XML of this structure: > > <resp> > <A> > <B a="foo bar bar"></B> > <B a="bar bar foo"></B> > <B a="boo far far"></B> > </A> > <A> > <B a="far boo"></B> > <B a="foo bar foo"></B> > <B a="bar foo bar"></B> > </A> > </resp> > > Using XSLT 1.0 (which I must, since I am constrained to use ASP.NET 2.0) I need to query the XML above to find all <A> if any of its children <B> fulfill a certain requirement. > > //A[ contains(B/@a, "foo") ] > > What I am seeing is that this XSL only checks the FIRST child node's (B) attribute instead of checking all of them. In other words, I only get this: > <resp> > <A> > <B a="foo bar bar"></B> > </A> > </resp> > ...instead of what I need, namely this: > <resp> > <A> > <B a="foo bar bar"></B> > <B a="bar bar foo"></B> > </A> > <A> > <B a="foo bar foo"></B> > <B a="bar foo bar"></B> > </A> > </resp> > > An attempt to alleviate this problem by amalgamating all the <B> together using string-join, i.e. > > //A[ contains( string-join(B/@a), "foo") ] > > error-out because string-join is XSLT 2.0 > > So...what is the correct way to query through all child nodes using xslt 1.0? > > Thanks Guys! > > Sincerely, > Mark Bordelon > Getty Trust
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] xslt 1.0 vs xslt 2.0 prob, Michael Kay | Thread | Re: [xsl] xslt 1.0 vs xslt 2.0 prob, Andrew Welch |
RE: [xsl] xslt 1.0 vs xslt 2.0 prob, Michael Kay | Date | Re: [xsl] xslt 1.0 vs xslt 2.0 prob, Andrew Welch |
Month |