xsl-list
[Top] [All Lists]

Re: filtering

2004-11-01 07:51:35
Here is a generic solution I wrote! A downside though;
it relies on node-set function..

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl">

<xsl:output method="xml" indent="yes"
encoding="UTF-8"/>
        
<xsl:template match="/root">
  <root>
    <xsl:variable name="rtf">
       <xsl:for-each select="row">
         <xsl:variable name="curr_row" select="."/>
         <xsl:variable name="x">
           <xsl:for-each select="column">
             <xsl:if test="position() = /root/header/*">
               <xsl:if test="normalize-space(.) = ''">
                 1
               </xsl:if>
             </xsl:if>
           </xsl:for-each>
         </xsl:variable>
         <xsl:if test="not(contains($x, '1'))">
           <success>
             <xsl:for-each select="/root/header/*">
                <xsl:element name="{name()}">
                  <xsl:value-of select="$curr_row/column[position()
= current()]"/>
                </xsl:element>
             </xsl:for-each>
           </success>
         </xsl:if>
       </xsl:for-each>
     </xsl:variable>
     <flow>
        <total_in><xsl:value-of select="count(row)"
/></total_in>
        <total_out><xsl:value-of select="count(row) -
count(msxsl:node-set($rtf)/*)" /></total_out>
     </flow>
     <xsl:copy-of select="msxsl:node-set($rtf)/*"/>
   </root>
</xsl:template>

</xsl:stylesheet>

Regards,
Mukul

--- Daniel Heskia <daniel(_at_)heskia(_dot_)dk> wrote:

Hi.
I am trying to filter out data sets that do not have
any data in the column
numbers specified in "header" of the xml.

The header specifies that columns 1, 2, 3 and 7 are
crucial in this
particular instance and must not be empty. The
values differ from time to
time (I cannot hardcode the numbers in the xsl), but
the element names in
"header" (AAA, BBB etc.) are static for this type of
data).

I need to test if the column numbers specified in
the header are non-empty
for each each row. I have tried to assign the values
of the header data to
variables and do something like: for each row, if
test not(column[$_aaa]='')
create the element. This, however, I cannot get to
work.

Does anyone have a good idea?

xml-input:

<root>
  <header> 
    <AAA>1</AAA>
    <BBB>2</BBB>
    <CCC>7</CCC>
    <DDD>3</DDD>
 </header>
  <row>
    <column>Dude Looks like a Lady</column>
    <column>Local</column>
    <column>28-10-2004</column>
    <column>51,23</column>
    <column />
    <column>80563</column>
    <column>IE000000004</column>
  </row>
  <row>
    <column>Never Ending Story</column>
    <column>Test</column>
    <column>21-02-2003</column>
    <column>51,23</column>
    <column />
    <column>80563</column>
    <column />
  </row>
</root>

xml-output:
Note 1 element filtered out because column 7 was
empty

<root>
  <flow>
    <total_in>2</total_in>
    <total_out>1</total_out>
  </flow>
  <success>
    <AAA>Dude Looks Like a Lady</AAA>
    <BBB>Local</BBB>
    <CCC>IE000000004</CCC>
    <DDD>28-10-2004</DDD>
  </success>
</root>



                
__________________________________
Do you Yahoo!?
Take Yahoo! Mail with you! Get it on your mobile phone.
http://mobile.yahoo.com/maildemo 


<Prev in Thread] Current Thread [Next in Thread>