?
Solved

XSLT 1.0 -  <msxsl:script>

Posted on 2002-03-06
10
Medium Priority
?
773 Views
Last Modified: 2013-11-19
In my XSLT 1.0 file, I'm trying to extract a value of a child element for placing it into the HTML <script> tag for initializing a javascript array(see code below). In WD-XSL,the "." or "this" value seems to be a node, and it's working with <xsl:eval>. In XSLT 1.0, can someone tells me what is the value of the "what" parameter in the <msxml:script> getNbOfRules(what) function? I always got errors on this function... What is different here between the old XSL call and the XSLT new one?

======================================

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:extra="urn:extra-functions"
     xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:output method="html" doctype-public="-//W3C//DTD HTML 4.0 Transitional//EN"/>

<xsl:template match="/">

<html>
<head><title>Rules</title></head>
     
<script language="javascript">
     var status = new Array(<xsl:value-of select="extra:getNbOfRules(.)"/>);
</script>

...

</xsl:template>

<msxsl:script implements-prefix="extra" language="javascript">

<![CDATA[
function getNbOfRules(what)
{
var i = 50;
var modules = what.selectSingleNode("MODULES/NBOFRULES");
i = modules.nodeTypedValue;
         
return i;
}
]]>    
</msxsl:script>
</xsl:stylesheet>
0
Comment
Question by:mhebert
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 4
10 Comments
 
LVL 23

Expert Comment

by:b1xml2
ID: 6845601
Firstly, there has been considerable changes in coding technique between XSL and XSLT. In the old XSL, we had to use the xsl:eval and xsl:script many times to do complicated stuff. In those days,we had to make direct calls to the XSLRuntime Engine such as <xsl:eval>this.nodeName</xsl:eval> which has since been replaced with the standard XSLT function name() as in
<xsl:value-of select="name()" />

Secondly, in the process of porting over code from the old style to the new style, you must abandon the method of simple line by line porting! You have to re-engineer the code for XSLT if you have been using less than efficient calls to xsl:script to perform complicate actions.

Thirdly, what is the root (not the same as the documentElement) and because the script is in the CDATA, you cannot do anything.

Fourthly, WHAT (pun intended!) are you intending to do?

Regards,

Brandon Driesen
0
 
LVL 23

Accepted Solution

by:
b1xml2 earned 400 total points
ID: 6846011
The following XML/XSLT shows you have to populate the script tag using the XSLT techniques and avoiding the msxsl:script extension whatsoever.

XML (books.xml)
===============
<?xml version='1.0' encoding='utf-8'?>
<collection>
  <book>
    <title>Cosmos</title>
    <author>Carl Sagan</author>
    <publisher>Ballantine Books</publisher>
  </book>
  <book>
    <title>Catwings</title>
    <author>Ursula K. Le Guin</author>
    <publisher>Scholastic</publisher>
  </book>
  <book>
    <title>Home Town</title>
    <author>Tracy Kidder</author>
    <publisher>Random House</publisher>
  </book>
</collection>

XSLT (books.xsl)
===============
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes" encoding="iso-8859-1" />
<xsl:template match="/">
<html>
<head>
<title>Porting From XSL To XSLT</title>
<script language="javascript">
<xsl:comment>
var aBooks = new Array(<xsl:apply-templates select="//book" mode="script" />);
window.onload = init;
function init() {
     if (aBooks.length != 0) {
          aBooks.sort();
          //CDATA WITHIN XSLT IS REQUIRED BECOS OF RESERVED CHARS HERE
          <![CDATA[document.body.innerHTML += "<h1>Authors</h1><div>" + aBooks.join("</div><div>") + "</div>";]]>
     }
}
// </xsl:comment>
</script>
</head>
<body style="background:#ffffff;">
</body>
</html>
</xsl:template>
<!--THE FOLLOWING TEMPLATE IS ON ONE SINGLE LINE. ADJUST ACCORDINGLY-->
<xsl:template match="book" mode="script">"<xsl:value-of select="author" />"<xsl:if test="position() != last()">,</xsl:if></xsl:template>
</xsl:stylesheet>

HTML Output (books.asp)
======================
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Porting From XSL To XSLT</title>
<script language="javascript">
<!--
var aBooks = new Array("Carl Sagan","Ursula K. Le Guin","Tracy Kidder");
window.onload = init;
function init() {
 if (aBooks.length != 0) {
  aBooks.sort();
  //CDATA WITHIN XSLT IS REQUIRED BECOS OF RESERVED CHARS HERE
  document.body.innerHTML += "<h1>Authors</h1><div>" + aBooks.join("</div><div>") + "</div>";
 }
}
// -->
</script>
</head>
<body style="background:#ffffff;"></body>
</html>

Regards,

Brandon Driesen
0
 
LVL 23

Expert Comment

by:b1xml2
ID: 6846030
You only ever use msxsl:script if there is no other way.
0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
LVL 1

Author Comment

by:mhebert
ID: 6847170
Thanks..I will work on that... ;-)
0
 
LVL 1

Author Comment

by:mhebert
ID: 6847240
Thanks..I will work on that... ;-)
0
 
LVL 1

Author Comment

by:mhebert
ID: 6847252
In XSLT, you cannot pass a node in parameter to a <msxsl:script> function? "." isn't a node?
0
 
LVL 23

Expert Comment

by:b1xml2
ID: 6847380
it depends on the context
<xsl:template match="/">

. refers to root and not documentElement
child::node()[1] refers to the documentElement

</xsl:template>
0
 
LVL 1

Author Comment

by:mhebert
ID: 6847435
In this case, where I'm not in the root, and I want to keep a value in a javascript variable(an example, it can be an integer..):
============================================
<xsl:for-each select="MODULE">
  <xsl:value-of select="extra:setModulePath(.)"/>
...
</xsl:for-each>
...
<msxsl:script implements-prefix="extra" language="javascript">
<![CDATA[
var modulePath = "";
               
function setModulePath(node)
{
var filePathNode = node.selectSingleNode("FILEPATH");
modulePath = filePathNode.nodeTypedValue + "html\\";
}
...
===========================================
By what I need to replace the "." in the call to let work properly the javascript function setModulePath()? The "." will be the current <MODULE> node.
0
 
LVL 23

Expert Comment

by:b1xml2
ID: 6849648
please note what I have said earlier.

>>
Thirdly, what is the root (not the same as the documentElement) and because the script is in the CDATA,
you cannot do anything.


WRONG!
>>
<msxsl:script implements-prefix="extra" language="javascript">
<![CDATA[
var modulePath = "";
             
function setModulePath(node)
{
var filePathNode = node.selectSingleNode("FILEPATH");
modulePath = filePathNode.nodeTypedValue + "html\\";
}
<<

RIGHT!
<msxsl:script implements-prefix="extra" language="javascript">
var modulePath = "";
             
function setModulePath(node)
{
var filePathNode = node.selectSingleNode("FILEPATH");
modulePath = filePathNode.nodeTypedValue + "html\\";
}

</msxsl:script>
you place the CDATA around any code which has the reserved XML characters of >,< &

and secondly, this is really not the way you code with XSLT *sigh*, you have to forget about the OLD way.

Next, you MUST return something in your function or it WON'T work, even if you do not intend to use the return value!!!

If you want to hold on to old tricks, you will bang yourself against the wall all the time.



0
 

Expert Comment

by:jedelman
ID: 7478185
I've been reading this post and I'm not sure if I completely follow - so can I call a javascript function in my xsl document or not?  

<msxsl:script implements-prefix="extra" language="javascript">

I understand that this line shouldn't be used.  But if I have a javascript written in my document, how can I call that function from elsewhere in my document?
0

Featured Post

On Demand Webinar: Networking for the Cloud Era

Did you know SD-WANs can improve network connectivity? Check out this webinar to learn how an SD-WAN simplified, one-click tool can help you migrate and manage data in the cloud.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Preface In the first article: A Better Website Login System (http://www.experts-exchange.com/A_2902.html) I introduced the EE Collaborative Login System and its intended purpose. In this article I will discuss some of the design consideratio…
Browsers only know CSS so your awesome SASS code needs to be translated into normal CSS. Here I'll try to explain what you should aim for in order to take full advantage of SASS.
The viewer will learn how to count occurrences of each item in an array.
The viewer will learn how to create a basic form using some HTML5 and PHP for later processing. Set up your basic HTML file. Open your form tag and set the method and action attributes.: (CODE) Set up your first few inputs one for the name and …

649 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question