![]() |
|
|
|||||||
![]() |
XML - Help with select statment on for-each |
|
|
Thread Tools | Search this Thread |
|
|
#1 |
|
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> Bill Sneddon |
|
|
|
|
#2 |
|
Posts: n/a
|
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 "Bill Sneddon" <> wrote in message news:bdhqln$3iq$... > 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> > |
|
|
|
#3 |
|
Posts: n/a
|
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. Marrow wrote: > 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 > > > > "Bill Sneddon" <> wrote in message > news:bdhqln$3iq$... > >>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> >> > > |
|