applying 2 xslt to an xml via script?

T

toby989

Hi All

I am completely new to this, but I was wondering if I can apply 2 xslt's
subsequently to an xml, via the (client side) scripting method:

http://www.w3schools.com/xsl/xsl_client.asp

Like maybe:

<html>
<body>

<script type="text/javascript">

// Load XML
var xml = new ActiveXObject("Microsoft.XMLDOM")
xml.async = false
xml.load("cdcatalog.xml")

// Load XSL ---- 1 ----
var xsl = new ActiveXObject("Microsoft.XMLDOM")
xsl.async = false
xsl.load("cdcatalog.xsl")

// Transform ---- 1 ----
document.write(xml.transformNode(xsl))

// Load XSL ---- 2 -----
var xsl2 = new ActiveXObject("Microsoft.XMLDOM")
xsl.async = false
xsl.load("cdcatalog2.xsl")

// Transform ---- 2 -----
document.write(xml.transformNode(xsl2))

</script>

</body>
</html>

Thaks for letting me know some scripting hints if anyone came across similar
situation.

Toby
 
M

Martin Honnen

I am completely new to this, but I was wondering if I can apply 2 xslt's
subsequently to an xml, via the (client side) scripting method:

<html>
<body>

<script type="text/javascript">

// Load XML
var xml = new ActiveXObject("Microsoft.XMLDOM")
xml.async = false
xml.load("cdcatalog.xml")

// Load XSL ---- 1 ----
var xsl = new ActiveXObject("Microsoft.XMLDOM")
xsl.async = false
xsl.load("cdcatalog.xsl")

// Transform ---- 1 ----
document.write(xml.transformNode(xsl))

// Load XSL ---- 2 -----
var xsl2 = new ActiveXObject("Microsoft.XMLDOM")
xsl.async = false
xsl.load("cdcatalog2.xsl")

// Transform ---- 2 -----
document.write(xml.transformNode(xsl2))

</script>

</body>
</html>

Well new ActiveXObject('Microsoft.XMLDOM') works with IE/Win if ActiveX
is enabled. And even with IE whether the object created with new
ActiveXObject('Microsoft.XMLDOM') supports XSLT 1.0 depends on the IE
version (IE 6 and later will do, IE 5 or IE 5.5 require MSXML 3 to be
installed in replace mode). Other browsers like Mozilla or Opera do not
support script creation of ActiveX objects.

transformNode gives a string, document.write expects a string thus if
you need/want to do two document.write calls with a string result of
transformNode passed in then you can do. Those stylesheets hopefully
generate HTML snippets that belong inside the body of an HTML document.
 
T

toby989

Martin said:
Well new ActiveXObject('Microsoft.XMLDOM') works with IE/Win if ActiveX
is enabled. And even with IE whether the object created with new
ActiveXObject('Microsoft.XMLDOM') supports XSLT 1.0 depends on the IE
version (IE 6 and later will do, IE 5 or IE 5.5 require MSXML 3 to be
installed in replace mode). Other browsers like Mozilla or Opera do not
support script creation of ActiveX objects.
Is there a type of scripting, one that does not need activex, that works for
different browsers, at the least ie5 and up and firefox?

transformNode gives a string, document.write expects a string thus if
you need/want to do two document.write calls with a string result of
transformNode passed in then you can do. Those stylesheets hopefully
generate HTML snippets that belong inside the body of an HTML document.
The second one produces html from xml, the first one produces XML from a special
form of XML.

I figured out how to merge the 2 xsl into one, but the initial question would
still be interesting how to do it.
 
A

Andy Dingley

I am completely new to this, but I was wondering if I can apply 2 xslt's
subsequently to an xml, via the (client side) scripting method:
[Explictly coded client-side JavaScript transforms via MSXML]

Yes, this is dead easy. Use two XSL documents and apply them one after
the other.

Remember to get the _results_ of the first transform as returned by the
..transformNode() method into a variable, rather than writing it back
directly. Then apply the second transform to _this_, not to your
original XML source.
 
T

toby989

Andy said:
I am completely new to this, but I was wondering if I can apply 2 xslt's
subsequently to an xml, via the (client side) scripting method:
[Explictly coded client-side JavaScript transforms via MSXML]


Yes, this is dead easy. Use two XSL documents and apply them one after
the other.

Remember to get the _results_ of the first transform as returned by the
.transformNode() method into a variable, rather than writing it back
directly. Then apply the second transform to _this_, not to your
original XML source.
OK, I think I will be able to do this. However, from what I know, the script
would work only for MS IE and not for Firefox. Actually I think the entire
approach is useless, if it doesnt work for Firefox.
 
M

Martin Honnen

Is there a type of scripting, one that does not need activex, that works
for different browsers, at the least ie5 and up and firefox?

Firefox has its own API exposed to script to run XSLT transformations,
it is documented here:
<http://developer.mozilla.org/en/docs/Using_the_Mozilla_JavaScript_interface_to_XSL_Transformations>
Opera 9 also supports that API.

Note that this API integrates well with the W3C DOM API in allowing you
to get a document fragment node as the transformation result and insert
it into a target document. Using document.write with that API is not
really a good idea in my view, as you would first serialize the result
nodes to a string to have document.write feed it to a parser again to
create nodes.

The second one produces html from xml, the first one produces XML from a
special form of XML.

Then you don't want the approach taken in your script example, instead
you want to chain the transformations, with MSXML you would use
transformNodeToObject to transform the original XML with the first
stylesheet into a second XML document on which you could then do
transformNode to get the HTML result.

With Mozilla/Firefox you would use transformToDocument first to
transform XML to XML and then in my view transformToFragment to
transform the XML to a HTML document fragment which you could then
insert with e.g. appendChild as needed.
 
A

Andy Dingley

However, from what I know, the script
would work only for MS IE and not for Firefox. Actually I think the entire
approach is useless, if it doesnt work for Firefox.

If you read the right tutorials (recent ones, probably mentioning AJAX)
then some slightly more sophisticated code will work on either.

It's not entirely web-portable, but it's usefully so.
 
T

toby989

Martin said:
Firefox has its own API exposed to script to run XSLT transformations,
it is documented here:
<http://developer.mozilla.org/en/docs/Using_the_Mozilla_JavaScript_interface_to_XSL_Transformations>
This page www.w3schools.com/xsl/xsl_client.asp shows the example for IE. Sorry,
I am so new to all this stuff. Do you have a link to a page that shows me how to
code this for Firefox?

Opera 9 also supports that API.

Note that this API integrates well with the W3C DOM API in allowing you
to get a document fragment node as the transformation result and insert
it into a target document. Using document.write with that API is not
really a good idea in my view, as you would first serialize the result
nodes to a string to have document.write feed it to a parser again to
create nodes.




Then you don't want the approach taken in your script example, instead
you want to chain the transformations, with MSXML you would use
transformNodeToObject to transform the original XML with the first
stylesheet into a second XML document on which you could then do
transformNode to get the HTML result.

I think I can do this, thanks. I also was able to merge the 2 XSLs into a single
one. Dont know what would be preferable.
 
J

Joseph Kesselman

I think I can do this, thanks. I also was able to merge the 2 XSLs into
a single one. Dont know what would be preferable.

A single combined transformation will generally be more efficient than
two in succession.
 

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

No members online now.

Forum statistics

Threads
473,994
Messages
2,570,223
Members
46,813
Latest member
lawrwtwinkle111

Latest Threads

Top