Help with select statment on for-each

B

Bill Sneddon

I am using the for-each below to build a table where the header is
a unique nonblank EQUIP_TYPE. This works well.

What I would like to do is not execute the for loop on on EQUIP_TYPE
unless one of the AUTOMATED tags equals YES.

I can change the data so that each row whould contain a tag that
shows if the EQUIP_TYPE has an AUTOMATED member but that seems wasteful.



<xsl:key name="tools-by-type" match="row" use="EQUIP_TYPE"/>
<xsl:template match="document">
<xsl:for-each select="row[count(. | key('tools-by-type', EQUIP_TYPE)[1])
= 1 and EQUIP_TYPE[string-length()>0 ] ">


sample of the XML

<document>
<row rowNumber="1">
<EQUIP_TYPE>ASH</EQUIP_TYPE>
<TOOL_NAME>ASHZ01ED</TOOL_NAME>
<AUTOMATED>YES</AUTOMATED>
</row>
<row rowNumber="2">
<EQUIP_TYPE>ASH</EQUIP_TYPE>
<TOOL_NAME>ASHZ02ED</TOOL_NAME>
<AUTOMATED>YES</AUTOMATED>
</row>
</document>
 
M

Marrow

Hi Bill,

I'm not absolutely sure what you want... but I think you are saying...

1) select the rows based on distinct <EQUIP_TYPE>
2) but only where the <EQUIP_TYPE> is not 'empty'
3) and where any one of the rows within that distinct <EQUIP_TYPE> value has
an <AUTOMATED> of 'YES'

If so, then perhaps you need something like...

<xsl:for-each select="row[EQUIP_TYPE/text()]
[generate-id() =
generate-id(key('tools-by-type',EQUIP_TYPE))]

[key('tools-by-type',EQUIP_TYPE)/AUTOMATED = 'YES']">

(nb. the predicates are respective to the numbered filter conditions above).

BTW, you are better to use the generate-id() version of the Muenchian
Technique as it generally performs better than the count() version of the
same technique.

Hope this helps
Marrow
http://www.marrowsoft.com - home of Xselerator (XSLT IDE and debugger)
http://www.topxml.com/Xselerator
 
B

Bill Sneddon

Yes you understood what I wanted thank you for being so helpful.
It will be a little while before I can test this but will test again
when that time comes.

Hi Bill,

I'm not absolutely sure what you want... but I think you are saying...

1) select the rows based on distinct <EQUIP_TYPE>
2) but only where the <EQUIP_TYPE> is not 'empty'
3) and where any one of the rows within that distinct <EQUIP_TYPE> value has
an <AUTOMATED> of 'YES'

If so, then perhaps you need something like...

<xsl:for-each select="row[EQUIP_TYPE/text()]
[generate-id() =
generate-id(key('tools-by-type',EQUIP_TYPE))]

[key('tools-by-type',EQUIP_TYPE)/AUTOMATED = 'YES']">

(nb. the predicates are respective to the numbered filter conditions above).

BTW, you are better to use the generate-id() version of the Muenchian
Technique as it generally performs better than the count() version of the
same technique.

Hope this helps
Marrow
http://www.marrowsoft.com - home of Xselerator (XSLT IDE and debugger)
http://www.topxml.com/Xselerator



I am using the for-each below to build a table where the header is
a unique nonblank EQUIP_TYPE. This works well.

What I would like to do is not execute the for loop on on EQUIP_TYPE
unless one of the AUTOMATED tags equals YES.

I can change the data so that each row whould contain a tag that
shows if the EQUIP_TYPE has an AUTOMATED member but that seems wasteful.



<xsl:key name="tools-by-type" match="row" use="EQUIP_TYPE"/>
<xsl:template match="document">
<xsl:for-each select="row[count(. | key('tools-by-type', EQUIP_TYPE)[1])
= 1 and EQUIP_TYPE[string-length()>0 ] ">


sample of the XML

<document>
<row rowNumber="1">
<EQUIP_TYPE>ASH</EQUIP_TYPE>
<TOOL_NAME>ASHZ01ED</TOOL_NAME>
<AUTOMATED>YES</AUTOMATED>
</row>
<row rowNumber="2">
<EQUIP_TYPE>ASH</EQUIP_TYPE>
<TOOL_NAME>ASHZ02ED</TOOL_NAME>
<AUTOMATED>YES</AUTOMATED>
</row>
</document>
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,480
Members
44,900
Latest member
Nell636132

Latest Threads

Top