XSL: parameter checking

Discussion in 'XML' started by Sharon, May 21, 2004.

  1. Sharon

    Sharon Guest

    Hi,
    Is it possible to check parameters against other parameters, as in:

    <xsl:variable name="tableData">
    <xsl:apply-templates
    select="general/data/rows/row/fvalues[$FIELD1=$FILTER1][$FIELD2=$FILTER2]"
    mode="tableData" />
    </xsl:variable>

    (The parts I'm referring to are in capitals). Because this gives me no
    output where I'm expecting 6 node elements. Is this because it's not
    possible to use parameters this way or is it just me making some other
    mistake in my Xpath? I hope the second is true so I don't have to come
    up with another solution... Thanks! Sharon
     
    Sharon, May 21, 2004
    #1
    1. Advertising

  2. Re: parameter checking

    Sharon wrote:
    > Hi,
    > Is it possible to check parameters against other parameters, as in:
    >
    > <xsl:variable name="tableData">
    > <xsl:apply-templates
    > select="general/data/rows/row/fvalues[$FIELD1=$FILTER1][$FIELD2=$FILTER2]"
    > mode="tableData" />
    > </xsl:variable>
    >


    select="general/data/rows/row/fvalues[$FIELD1=$FILTER1 and
    $FIELD2=$FILTER2]"


    JW
     
    Janwillem Borleffs, May 21, 2004
    #2
    1. Advertising

  3. (Sharon) writes:
    > Is it possible to check parameters against other parameters, as in:
    >
    > <xsl:variable name="tableData">
    > <xsl:apply-templates
    > select="general/data/rows/row/fvalues[$FIELD1=$FILTER1][$FIELD2=$FILTER2]"
    > mode="tableData" />
    > </xsl:variable>
    >
    > (The parts I'm referring to are in capitals). Because this gives me no
    > output where I'm expecting 6 node elements. Is this because it's not
    > possible to use parameters this way or is it just me making some other
    > mistake in my Xpath? I hope the second is true so I don't have to come
    > up with another solution... Thanks! Sharon


    Give the expression

    "general/data/rows/row/fvalues[$FIELD1=$FILTER1 and $FIELD2=$FILTER2]"

    a try and see if it helps. If not then post again with a bigger
    example (eg. some XML input and an idea of the output you want).

    Ben

    --
    Ben Edgington
    Mail to the address above is discarded.
    Mail to ben at that address might be read.
    http://www.edginet.org/
     
    Ben Edgington, May 21, 2004
    #3
  4. Thanks, you guys, but that wasn't the problem. My XSL works fine when I
    change the line to:
    select="general/data/rows/row/fvalues[fclient=$filter1][fcity=$filter2]"
    mode="tableData"
    > that is when I change the first parameter into a specific node. But

    that's exactly what I'm trying to avoid: I want to create a filter that
    is not predefined and takes table values that are selected by the user
    as its parameters(column name would be $field and filtervalue would be
    $filter). The parameter $field could then take any of the existing
    column names (such as fclient, fcity etc.) as its value and the
    parameter $filter would contain the value to be filtered on. Obviously
    it can't be done this way, can anyone tell me how I might work around
    this problem? Thanks! Sharon

    *** Sent via Developersdex http://www.developersdex.com ***
    Don't just participate in USENET...get rewarded for it!
     
    Sharon Steringa, May 21, 2004
    #4
  5. Sharon Steringa <> writes:
    > Thanks, you guys, but that wasn't the problem. My XSL works fine when I
    > change the line to:
    > select="general/data/rows/row/fvalues[fclient=$filter1][fcity=$filter2]"
    > mode="tableData"
    > > that is when I change the first parameter into a specific node. But

    > that's exactly what I'm trying to avoid: I want to create a filter that
    > is not predefined and takes table values that are selected by the user
    > as its parameters(column name would be $field and filtervalue would be
    > $filter). The parameter $field could then take any of the existing
    > column names (such as fclient, fcity etc.) as its value and the
    > parameter $filter would contain the value to be filtered on. Obviously
    > it can't be done this way, can anyone tell me how I might work around
    > this problem? Thanks! Sharon


    It's kind of hard to understand the problem without the example code I
    suggested you post, so it's no surprise that the answers are off-beam.

    Anyway, I hope I've managed to decipher what you want from the
    somewhat obscure description above. Try this:

    select="general/data/rows/row/fvalues/
    *[name()=$field and node()=$filter1]/../
    *[name()=$filter and node()=$filter2]/.."

    [Note, I've split the line to avoid wrapping: just join it all up]

    Ben

    --
    Ben Edgington
    Mail to the address above is discarded.
    Mail to ben at that address might be read.
    http://www.edginet.org/
     
    Ben Edgington, May 21, 2004
    #5
  6. Hmmm, that's a good lesson for me because I was trying to be as clear as
    possible about my problem and thought I had succeeded :)...Maybe it's
    time I improve my communication skills. Anyway, the reason I was
    reluctant to post my XML and XSL is because when I did that before,
    nobody answered so I thought: "Maybe it scares people...So if I want
    answers I will have to ask small questions and not provide too much code
    at once." Here's my XML anyway:

    <?xml version="1.0" encoding="utf-8" ?>
    <general>
    <data>
    <header></header>
    <global>
    <orderby />
    <created />
    </global>
    <cols>
    <fclient caption="Client" type="number" visible="True" />
    <fid caption="Sleutelveld" type="number" visible="True" />
    <fusername caption="Username" type="number" visible="True"/>
    <fname caption="Naam" type="text" visible="True" />
    <fcity caption="Woonplaats" type="text" visible="True" />
    <factive caption="Active" type="text" visible="False" />
    <fdebno caption="Debiteurnr" type="number" visible="True" />
    <fpassword caption="password" type="text" visible="False" />
    </cols>
    <rows>
    <row>
    <id value="32" />
    <fvalues>
    <fclient>1</fclient>
    <fid>13</fid>
    <fusername>Pietje</fusername>
    <fname>Pieters Autotransport B.V.</fname>
    <fcity>Meppel</fcity>
    <factive>True</factive>
    <fdebno>5</fdebno>
    <flanguage>NL</flanguage>
    <fpassword>Flup</fpassword>
    </fvalues>
    </row>
    <row>
    <id value="43" />
    <fvalues>
    <fclient>2</fclient>
    <fid>43</fid>
    <fusername>Willie</fusername>
    <fname>Willie Bruining</fname>
    <fcity>Blijham</fcity>
    <factive>True</factive>
    <fdebno>9</fdebno>
    <flanguage>NL</flanguage>
    <fpassword>Kwik</fpassword>
    </fvalues>
    </row>
    <row>
    <id value="21" />
    <fvalues>
    <fclient>3</fclient>
    <fid>83</fid>
    <fusername>Bertje</fusername>
    <fname>Bertje Autotransport B.V.</fname>
    <fcity>Meppel</fcity>
    <factive>True</factive>
    <fdebno>9</fdebno>
    <flanguage>NL</flanguage>
    <fpassword>Kwek</fpassword>
    </fvalues>
    </row>
    <row>
    <id value="64" />
    <fvalues>
    <fclient>0</fclient>
    <fid>73</fid>
    <fusername>Billie</fusername>
    <fname>Billie Bruining</fname>
    <fcity>Billieham</fcity>
    <factive>True</factive>
    <fdebno>3</fdebno>
    <flanguage>NL</flanguage>
    <fpassword>Kwak</fpassword>
    </fvalues>
    </row>
    <row>
    <id value="25" />
    <fvalues>
    <fclient>5</fclient>
    <fid>23</fid>
    <fusername>Pietje</fusername>
    <fname>Bob Autotransport B.V.</fname>
    <fcity>Zaandam</fcity>
    <factive>True</factive>
    <fdebno>9</fdebno>
    <flanguage>NL</flanguage>
    <fpassword>Kwuk</fpassword>
    </fvalues>
    </row>
    <row>
    <id value="68" />
    <fvalues>
    <fclient>4</fclient>
    <fid>10</fid>
    <fusername>Sjoerd</fusername>
    <fname>Sjoerd de Vries</fname>
    <fcity>Billieham</fcity>
    <factive>True</factive>
    <fdebno>5</fdebno>
    <flanguage>NL</flanguage>
    <fpassword>Kwok</fpassword>
    </fvalues>
    </row>
    </rows>
    </data>
    <footer></footer>
    </general>

    And here's the XSL (based on an example by RDC Pro):

    <?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"
    xmlns:dates="urn:rdcpro-com:dates">
    <xsl:eek:utput method="html" encoding="UTF-8"/>
    <xsl:param name="username" select="general/data/rows/row"/>
    <xsl:param name="field1" select="'fclient'"/>
    <xsl:param name="filter1" select="$username/fvalues/fclient"/>
    <xsl:param name="field2" select="'fcity'"/>
    <xsl:param name="filter2" select="$username/fvalues/fcity"/>
    <xsl:param name="direction">ascending</xsl:param>
    <xsl:param name="sortBy">fusername</xsl:param>
    <xsl:variable name="tableData">
    <xsl:apply-templates
    select="general/data/rows/row/fvalues[name()=$field1 and
    node()=$filter1][name()=$field2 and node()=$filter2] " mode="tableData"
    />
    </xsl:variable>
    <xsl:template match="general/data">
    <div align="left">
    <div class="content" align="right" style="padding-bottom:4px;">
    Sort Direction:
    <xsl:value-of select="$direction"/><br/>
    Sort Column:
    <xsl:value-of select="$sortBy"/>
    </div>
    <table border="1" class="results" align="center" cellpadding="5"
    cellspacing="0">
    <tr>
    <th>
    <a class="clickanchor" onclick="renderData('fclient');">
    <xsl:value-of select="cols/fclient/@caption"/>
    </a>
    </th>
    <th>
    <a class="clickanchor" onclick="renderData('fid');">
    <xsl:value-of select="cols/fid/@caption"/>
    </a>
    </th>
    <th>
    <a class="clickanchor" onclick="renderData('fusername');">
    <xsl:value-of select="cols/fusername/@caption"/>
    </a>
    </th>
    <th>
    <a class="clickanchor" onclick="renderData('fname');">
    <xsl:value-of select="cols/fname/@caption"/>
    </a>
    </th>
    <th>
    <a class="clickanchor" onclick="renderData('fcity');">
    <xsl:value-of select="cols/fcity/@caption"/>
    </a>
    </th>
    <th>
    <a class="clickanchor" onclick="renderData('fdebno');">
    <xsl:value-of select="cols/fdebno/@caption"/>
    </a>
    </th>
    </tr>
    <xsl:apply-templates select="msxsl:node-set($tableData)/fvalues">
    <xsl:sort select="*[name()=$sortBy]" order="{$direction}"/>
    </xsl:apply-templates>
    </table>
    </div>
    </xsl:template>
    <xsl:template match="fvalues">
    <tr>
    <xsl:for-each select="*">
    <td>
    <xsl:value-of select="."/>
    </td>
    </xsl:for-each>
    </tr>
    </xsl:template>
    <xsl:template match="fvalues" mode="tableData">
    <xsl:copy>
    <xsl:for-each select="*">
    <xsl:if
    test="/general/data/cols/*[name()=name(current())]/@visible='True'">
    <xsl:copy-of select="."/>
    </xsl:if>
    </xsl:for-each>
    </xsl:copy>
    </xsl:template>
    </xsl:stylesheet>

    Now I want the data to display properly, just like it does with the
    select statement of the apply-templates in the variable that I mentioned
    in my last post. I filled in what I thought you meant in my XSL but it
    still won't show any data, maybe you meant something else. Anyway thanks
    a lot for your comments, hope you can help me some more with this
    example code. Thanks! Sharon


    *** Sent via Developersdex http://www.developersdex.com ***
    Don't just participate in USENET...get rewarded for it!
     
    Sharon Steringa, May 21, 2004
    #6
  7. Sharon Steringa <> writes:
    > Hmmm, that's a good lesson for me because I was trying to be as clear as
    > possible about my problem and thought I had succeeded :)...Maybe it's
    > time I improve my communication skills. Anyway, the reason I was
    > reluctant to post my XML and XSL is because when I did that before,
    > nobody answered so I thought: "Maybe it scares people...So if I want
    > answers I will have to ask small questions and not provide too much code
    > at once." Here's my XML anyway:


    It's much quicker for anyone trying to work on a problem if an example
    is given - preferably a small abstract that encapsulates the problem -
    including the code, input data and the output you expect.

    Text descriptions of problems are rarely easy to follow. A snippet of
    code is so much clearer.

    > Now I want the data to display properly, just like it does with the
    > select statement of the apply-templates in the variable that I mentioned
    > in my last post. I filled in what I thought you meant in my XSL but it
    > still won't show any data, maybe you meant something else. Anyway thanks
    > a lot for your comments, hope you can help me some more with this
    > example code. Thanks! Sharon


    Your XSL has the following XPat expression
    > general/data/rows/row/fvalues[name()=$field1 and
    > node()=$filter1][name()=$field2 and node()=$filter2]


    which bears only a passing resemblence to what I wrote. If you do
    actually put in what I wrote it works fine. The dots and stars
    make all the difference:

    <xsl:apply-templates
    select="general/data/rows/row/fvalues/*[name()=$field1 and
    node()=$filter1]/../*[name()=$field2 and node()=$filter2]/.."
    mode="tableData"
    />

    With your data and corrected template you get all the output
    (because your parameter statements for filter1 and filter2 give
    you all the fclient and fcity nodes.)

    However, if you set
    <xsl:param name="filter1" select="'5'"/>
    <xsl:param name="filter2" select="'Zaandam'"/>

    then you get only the data for fclient=5 and fcity=Zaandam
    which I'm still assuming is what you want.

    Ben

    --
    Ben Edgington
    Mail to the address above is discarded.
    Mail to ben at that address might be read.
    http://www.edginet.org/
     
    Ben Edgington, May 21, 2004
    #7
  8. Wow, thanks, you are absolutely right! Great!

    *** Sent via Developersdex http://www.developersdex.com ***
    Don't just participate in USENET...get rewarded for it!
     
    Sharon Steringa, May 24, 2004
    #8
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    1
    Views:
    3,611
    A. Bolmarcich
    May 27, 2005
  2. Replies:
    7
    Views:
    17,042
    Peter Flynn
    Dec 3, 2005
  3. Replies:
    3
    Views:
    332
  4. pek
    Replies:
    71
    Views:
    1,998
    Arne Vajhøj
    Jun 20, 2008
  5. Travis Parks

    Checking Signature of Function Parameter

    Travis Parks, Aug 28, 2011, in forum: Python
    Replies:
    10
    Views:
    354
    Ethan Furman
    Aug 30, 2011
Loading...

Share This Page