so im still gettin' errors

<?php

$sort='';
$table='';

if(isset($_GET['sort']) and ctype_alnum($_GET['sort']) and isset($_GET['table']) and ctype_alnum($_GET['table']))
{
	$sort = $_GET['sort'];
	$table = $_GET['table'];
}
?>

<html>
<head>
<script type="text/javascript">
function loadXMLDoc(fname)
{
  var xmlDoc;
  // code for IE
  if (window.ActiveXObject)
  {
    xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  }
  // code for Mozilla, Firefox, Opera, etc.
  else if (document.implementation
  && document.implementation.createDocument)
  {
    xmlDoc=document.implementation.createDocument("","",null);
   }
  else
  {
    alert('Your browser cannot handle this script');
  }
xmlDoc.async=false;
xmlDoc.load(fname);
return(xmlDoc);
}

function displayResult()
{
xml=loadXMLDoc("pr.xml");
xsl=loadXMLDoc("pr.xsl");
// code for IE
if (window.ActiveXObject)
  {
    ex=xml.transformNode(xsl);
    document.getElementById("example").innerHTML=ex;
  }
  // code for Mozilla, Firefox, Opera, etc.
  else if (document.implementation
  && document.implementation.createDocument)
  {
    xsltProcessor=new XSLTProcessor();
    xsltProcessor.importStylesheet(xsl);
	xsltProcessor.setParameter("sort","<?php echo $sort; ?>","");
	xsltProcessor.setParameter("table","<?php echo $table; ?>","");
    resultDocument = xsltProcessor.transformToFragment(xml,document);
    document.getElementById("example").appendChild(resultDocument);
  }
}
</script>
</head>
<body id="example" onLoad="displayResult()">
</body>
</html> 

in my xsl:

	<xsl:param name="sort" />
	<xsl:param name="table" />
	<xsl:sort select="$sort" />

throws this error:

Error during XSLT transformation: XSLT transformation failed.

    strike that... i was running it locally... no errors now, but when i clock my sort links nothing changes in the sort... wen i view source the parameters in the setparameter are set appropriately

      well that leaves you down to the xsl itself.
      you'll want to have it spit out a dection that lists off the parameter values for debugging to start with, then if they're all as expected, it'll be in the sorting guts of the xsl

        btw, when I first tried to do this it took me a few days to find out how, and work out the kinks, but it's pretty damn hot when it works.

        I have my latest project working all in js - when the links are clicked, they call js functions that pass the variables and restor it realtime - no page reloads. all teh data is in teh xml which is loaded once, and i just reapply the xsl with the new parameters, and plop it back into the page over the pre-existing display. I even worked pagination into it 🙂
        I'd give you a look at the source code but i did it for work, so i don't own the code, and it's sitting behind some tight security so the outside world can't see it (it's for paid subscribers, a reporting suite) but it allows a set of data to be selected, and gets uses the js to pull the xml from a php script that pulls the data from mysql, and formats it into xml, then the xsl goes to work from there.

          CoderDan;10917222 wrote:

          well that leaves you down to the xsl itself.
          you'll want to have it spit out a dection that lists off the parameter values for debugging to start with, then if they're all as expected, it'll be in the sorting guts of the xsl

          I have my params declared aright at the top and when I try to use:

          <xsl:value-of select="$sort"/>

          in my xsl, it doesnt output anything

            appears i had the setParameter params wrong... documentation is sketchy on this stuff

            	xsltProcessor.setParameter(null,"sort","<?php echo $sort; ?>");
            	xsltProcessor.setParameter(null,"table","<?php echo $table; ?>");
            

            so then my output:

            <xsl:value-of select="$sort"/>
            

            works but when I try:

            <xsl:sort select="$sort"/>
            

            nothing changes!! and i verified that the variable im passing for sort is an element name in the XML tree

            arg

              well, it appears you are only setting parameters for mozilla based browsers (firefox, etc) - are you viewing this in firefox, or are you using ie for some strange reason?

              for firefox the parameter setting appears correct to me.

              in case it helps, I have a working js function that looks a lil something like this:
              (of course, this references some vars that aren't showing, and is completly js driven, but you should be able to get the gist of it)

              function XSLTTransform ( the_xsl, the_xml, parameter_array )
              {
              	if ( window.ActiveXObject )
              	{
              		var XSLTCompiled = new ActiveXObject( 'MSXML2.XSLTemplate' );
              		XSLTCompiled.stylesheet = the_xsl.documentElement;
              		// create XSL-processor
              		var XSLTProc = XSLTCompiled.createProcessor();
              		XSLTProc.input = the_xml;
              
              	if ( parameter_array )
              	{
              		for ( var i in parameter_array )
              		{
              			XSLTProc.addParameter( i, parameter_array[i] );
              		}
              	}
              
              	XSLTProc.transform();
              
              	if ( actions_div )
              	{
              		content_holder.innerHTML = "<div id='actions'>" + actions_div.innerHTML + "</div>" + XSLTProc.output;
              	}
              	else
              	{
              		content_holder.innerHTML = XSLTProc.output;
              	}
              }
              else if ( document.implementation && document.implementation.createDocument )
              {
              	XSLTProc = new XSLTProcessor();
              	XSLTProc.importStylesheet( the_xsl );
              
              	if ( parameter_array )
              	{
              		for ( var i in parameter_array )
              		{
              			XSLTProc.setParameter( null, i, parameter_array[i] );
              		}
              	}
              
              	TransformDoc = XSLTProc.transformToFragment( the_xml, document );
              
              	clearContent ( );
              
              	if ( actions_div )
              	{
              		content_holder.appendChild( actions_div );
              	}
              	content_holder.appendChild( TransformDoc );
              }
              else
              {
              	window.alert( 'Browser does not support XSLT.' );
              	return false;
              }
              }

                the actual method of sorting I used was the following:
                my xml basically provided a sort value for each entry

                <datal>
                  <entry>
                    <field>
                      <name>Amount</name>
                      <value>$10.00</value>
                      <sort>1000</sort>
                    </field>
                    <field>
                      <name>Date</name>
                      <value>19/4/08</value>
                      <sort>20080419</sort>
                    </field>
                  </entry>
                  <entry>
                    <field>
                      <name>Amount</name>
                      <value>$25.45</value>
                      <sort>2545</sort>
                    </field>
                    <field>
                      <name>Date</name>
                      <value>18/4/08</value>
                      <sort>20080418</sort>
                    </field>
                  </entry>
                </data>
                

                that should give you the idea - for string values I just replicated the string in lowercase.
                then I had my sort value be the 'column' number, with a desc flag
                then in the xsl that displayed it, something like this (not sure if it meshes with my example xml )

                				<xsl:choose>
                					<xsl:when test='$sort_desc'>
                						<xsl:apply-templates select='Result'>
                							<xsl:sort order='descending' select='Field[$sort_by]/Sort' data-type='number' />
                						</xsl:apply-templates>
                					</xsl:when>
                					<xsl:otherwise>
                						<xsl:apply-templates select='Result'>
                							<xsl:sort order='ascending' select='field[$sort_by]/sort' data-type='number' />
                						</xsl:apply-templates>
                					</xsl:otherwise>
                				</xsl:choose>
                

                not sure if that's enough to give you a grasp of it, if not I can probably post a full example, just it's a pain to redact it 😛

                  perhaps providing my code can help you help me a little further

                  here is the block of xsl that dumps one of my three tables:

                  <h2>Current Collections</h2>
                  <table cellspacing="0" cellpadding="2">
                  	<thead><xsl:call-template name="table_header"/></thead>
                  	<tbody>
                  		<xsl:for-each select="channel/item[collectionStatus='Active']">
                  			<xsl:call-template name="table_row"/>			
                  		</xsl:for-each>
                  	</tbody>
                  </table>
                  

                  i was attempting to set the sort right under the foreach

                  currently have 8 header values that i would like to sort by

                    KK, I'm at home now, so no code of my own to look at, but from memory I think you need to set up the template table_row to have a parameter, and pass the search parameter to it.

                      well my parameters are declared at the top of my xsl so they should be considered global

                        it's also "crashing" when i add an xsl:sort element within my table_row template... presumable i need to have that sort element right after that for-each... any other way seems to make it die

                          dan when you get a moment... i tried putzing around with your when/choose implementation a bit last night and I couldnt seem to make it work

                          perhaps you could review your code at the office and give me a little more insight (my apologies for the annoying redactions)

                            ok. I just went over a chunk of the code.
                            I chopped out a lot of crap that wasn't needed, and redacted teh rest, it's missing most of it's css, all of it's images, etc, etc.

                            as a brief overview: it's a reporting system that is customised to the user - the menu on the left is custom generated based on the user's "inventory" so to speak.
                            they select items on the left menu, then get teh report, which is usually generated by a php script that generates the xml, meaning the eventual report has a varying amount of columns, that can potentially hold different types of data, thus the xsl is bigger than usual so it can deal with dynamic incoming data structures.
                            I pulled an xml result from the generator and provided it as sample xml, so the menu selections won't actually modify the data (but u have to select something to start the report)
                            it'll be a lil difficult to navigate as the images are all broken, etc, but you should be able to get a working example out of it, functionality-wise.
                            if you have any more questions, just ask.

                            Oh, also - this is an unfinished project, and is being written under a time restriction, so I know it's probably not the cleanest code out there.

                              forgot a file, and can't edit my post for some reason, so here it is again with the missing html

                                holy crow I got it to work

                                I had to do this:

                                <xsl:sort select="*[name() = $sort]" />

                                NOW! the only thing thats left... since this will sort all three tables and I only want to sort one I tried this:

                                <xsl:if test="$table = 'active'">
                                <xsl:sort select="*[name() = $sort]" />
                                </xsl:if>

                                and that blew up on me...

                                SOB! 🙂

                                  hmm, without looking into it too far, you can try moving your if statement further out, and probably changing it to a choose - I know xsl has a lot of issues with what an if or choose check can be inside of.

                                  if you post the xsl and surrounding section I can take a better look if that much doesn't help.

                                  btw - did the crap i uploaded help you any?

                                    CoderDan;10917422 wrote:

                                    btw - did the crap i uploaded help you any?

                                    it certainly did.. gave me some good insight on how to do some other things i had in mind... especially the nav stuff... pretty slick... thanks for that 🙂

                                      Write a Reply...