xsl-list
[Top] [All Lists]

Re: [xsl] xslt 1.0 vs xslt 2.0 problem

2008-09-03 13:41:35
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(_at_)yahoo(_dot_)com> 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




--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--