Connecting Tech Pros Worldwide Help | Site Map

How to import javascript in xsl

Newbie
 
Join Date: Jan 2009
Location: Denmark
Posts: 13
#1: Jan 18 '09
Hi,

I write a javascript function in xsl (UOMConversion.xsl) as follow:
Expand|Select|Wrap|Line Numbers
  1. <?xml version="1.0"?>
  2. <xsl:stylesheet version="1.0"
  3.     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  4.  
  5. <script language="Javascript">
  6. <![CDATA[
  7. var ISOUOM= new Array("KGM","MTR","LTR","CT");
  8. var MESUOM= new Array("KG","M","L","KAR");
  9.  
  10. function UOMISOTOMES(UOMIn) {
  11.     var i;
  12.     var UOMOut;
  13.     for (i=0; i<=ISOUOM.length; i++)
  14.     {
  15.         if (UOMIn == ISOUOM[i]) {
  16.             UOMOut = MESUOM[i];
  17.         }
  18.     }
  19.     return UOMOut;
  20. }
  21. ]]>
  22. </script>    
  23. </xsl:stylesheet>
I would like to import above UOMConversion.xsl into a xsl (LibUserFunctions.xsl). I write:

Expand|Select|Wrap|Line Numbers
  1. <xsl:stylesheet version="1.0" 
  2.     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  3.     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  4.  
  5. <xsl:import href="UOMConversion.xsl"/> 
  6. ....
  7. </xsl:stylesheet>
I got an error when I use LibUserFunctions.xsl to transform an xml - "Keyword xsl:stylesheet may not contain script. Error occurred during compilation of included or imported stylesheet 'file..."

Where is the problem?

Regards
maxin
Dormilich's Avatar
Moderator
 
Join Date: Aug 2008
Location: Leipzig, Germany
Posts: 3,641
#2: Jan 18 '09

re: How to import javascript in xsl


Quote:

Originally Posted by maxin View Post

Where is the problem?

as stated in the error message, <script> is not an allowed child element of <xsl:stylesheet> see XSL Transformations (XSLT) for the allowed elements.
Newbie
 
Join Date: Jan 2009
Location: Denmark
Posts: 13
#3: Jan 18 '09

re: How to import javascript in xsl


I also used date function EXSLT. The date.msxsl.xsl has also some javascript as
Expand|Select|Wrap|Line Numbers
  1. <?xml version="1.0"?>
  2. <xsl:stylesheet version="1.0"
  3.                 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  4.                 xmlns:date="http://exslt.org/dates-and-times"
  5.                 xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  6.                 extension-element-prefixes="date msxsl">
  7.  
  8. <msxsl:script language="Javascript" implements-prefix="date">
  9. <![CDATA[
  10. ...
  11. ]]>
  12. </msxsl:script>
  13. </xsl:stylesheet>
The different is I dont have the namespace. I don't have any problem to import date.msxsl.xsl.

Regards
maxin
Newbie
 
Join Date: Jan 2009
Location: Denmark
Posts: 13
#4: Jan 18 '09

re: How to import javascript in xsl


Hi,
Thanks for you answer.
It seems I need the namespace. I can import the xsl file successfully. However, I still get an error in the above javascript - "Microsoft JScript runtime error Wong number of arguments or invalid property..." I attached some codes.

Here is a xml which will be transformed:
Expand|Select|Wrap|Line Numbers
  1. <?xml version="1.0" encoding="UTF-8" ?> 
  2. <?xml-stylesheet type="text/xsl" href="LOIPRO01_2_B2MML.xsl"?> 
  3. <LOIPRO01>
  4. <MEINS>MTR</MEINS> 
  5. </LOIPRO01>
  6.  
The LOIPRO01_2_B2MML.xsl is:
Expand|Select|Wrap|Line Numbers
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xsl:stylesheet version="1.0" 
  3. xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  4. xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  6. xmlns="http://www.yyy.com/ad/mes/b2mt-1.0" 
  7. xmlns:bml="http://www.wbf.org/xml/b2mml-v02" 
  8. xmlns:LibUserFunctions="http://www.yyy.com/UDF/LibUserFunctions" 
  9.     exclude-result-prefixes="xs xsl xsi LibUserFunctions">
  10.  
  11. <xsl:import href="LibUserFunctions.xsl"/>
  12.  
  13. <xsl:template match="/LOIPRO01">
  14.        <bml:UnitOfMeasure>
  15.     <xsl:call-template name="LibUserFunctions:ISOUOMToMESUOM">
  16.           <xsl:with-param name="UOM" select="MEINS"/>
  17.                </xsl:call-template>
  18.        </bml:UnitOfMeasure>
  19. </xsl:template>
  20. </xsl:stylesheet>
  21.  
and function ISOUOMToMESUOM is in the imported xsl LibUserFunctions.xsl:
Expand|Select|Wrap|Line Numbers
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xsl:stylesheet version="1.0" 
  3. xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  4. xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  5. xmlns:date="http://exslt.org/dates-and-times" extension-element-prefixes="date" 
  6. xmlns:log="http://www.xxx.com" 
  7. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  8. xmlns:LibUserFunctions="http://www.yyy.com/UDF/LibUserFunctions" 
  9.     exclude-result-prefixes="xs xsl xsi LibUserFunctions">
  10.  
  11. <xsl:import href="UOMConversion.xsl"/> 
  12.  
  13. <xsl:template name="LibUserFunctions:ISOUOMToMESUOM">
  14.     <xsl:param name="UOM"/>
  15.     <xsl:value-of select="log:UOMISOTOMES($UOM)"/>
  16. </xsl:template>
  17. </xsl:stylesheet>
  18.  
the function log:UOMISOTOMES is in the imported UOMConversion.xsl:
Expand|Select|Wrap|Line Numbers
  1. <?xml version="1.0"?>
  2. <xsl:stylesheet version="1.0"
  3.     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  4.     xmlns:log="http://www.xxx.com"
  5.     xmlns:msxsl="urn:schemas-microsoft-com:xslt">
  6.  
  7. <msxsl:script language="Javascript" implements-prefix="log">
  8. <![CDATA[
  9. var ISOUOM= new Array("KGM","MTR","LTR","CT");
  10. var MESUOM= new Array("KG","M","L","KAR");
  11. function UOMISOTOMES(UOMIn) {
  12.     var i;
  13.     var UOMOut;
  14.     for (i=0; i<=ISOUOM.length; i++)
  15.     {
  16.         if (UOMIn == ISOUOM[i]) {
  17.             UOMOut = MESUOM[i];
  18.         }
  19.     }
  20.     return UOMOut;
  21. }
  22. ]]>
  23. </msxsl:script>    
  24. </xsl:stylesheet>
  25.  
Regards
maxin
Dormilich's Avatar
Moderator
 
Join Date: Aug 2008
Location: Leipzig, Germany
Posts: 3,641
#5: Jan 18 '09

re: How to import javascript in xsl


Quote:

Originally Posted by maxin View Post

However, I still get an error in the above javascript - "Microsoft JScript runtime error Wong number of arguments or invalid property..."

you have a mistake in the for loop. the length of your array is 4, thus the last index is 3. change the end condition to "i < ISOUOM.length".

tip: it is better coding style to compute the array length outside the loop. for larger arrays you get a performance advantage. (this is generally recommended for all programming languages)
Expand|Select|Wrap|Line Numbers
  1. l = array.length;
  2. for (i=0; i<l; i++) { ... }
Newbie
 
Join Date: Jan 2009
Location: Denmark
Posts: 13
#6: Jan 18 '09

re: How to import javascript in xsl


Hi Dormilich,
Thanks so much for your answer. I changed my codes, But I stille get the same error. The interesting is if I make the javascript as .js and import it in html. No error occurs.
Regards
maxin
Newbie
 
Join Date: Jan 2009
Location: Denmark
Posts: 13
#7: Jan 18 '09

re: How to import javascript in xsl


The problem seems in <![CDATA[ ... ]]> of the UOMConversion.xsl. It does not like "==" in if (UOMIn == ISOUOM[i]). However, if I change it to "=", it doesnot work correctly either. Is this a special kind of javascript in CDATA?
Regards
maxin
Dormilich's Avatar
Moderator
 
Join Date: Aug 2008
Location: Leipzig, Germany
Posts: 3,641
#8: Jan 18 '09

re: How to import javascript in xsl


Quote:

Originally Posted by maxin View Post

The interesting is if I make the javascript as .js and import it in html. No error occurs.

maybe it's time to ask why you put in the JScript this way. to me it seems like an overkill to use xsl where a simple (and working) html call would suffice.

PS: not that I'd always use the most straightforward way.........
Newbie
 
Join Date: Jan 2009
Location: Denmark
Posts: 13
#9: Jan 19 '09

re: How to import javascript in xsl


It is not a html I will make. This xsl is used to transfer IDOC to B2MML when I import an IDOC from SAP to MES.
Dormilich's Avatar
Moderator
 
Join Date: Aug 2008
Location: Leipzig, Germany
Posts: 3,641
#10: Jan 19 '09

re: How to import javascript in xsl


just had a quick lookup of IDoc & B2MML. where does the javascript fit in, since both types are xml?
Newbie
 
Join Date: Jan 2009
Location: Denmark
Posts: 13
#11: Jan 19 '09

re: How to import javascript in xsl


MES will use LOIPRO01_2_B2MML.xsl to transfer IDOC to B2MML, from one xml to another xml. I just nees a function to convert ISO code of UOM (Unit of measure KGM from SAP) to normal UOM (kg in MES) during the transform. However, I can not find a xpath function to do it. Therefor I made a by javascript.
Dormilich's Avatar
Moderator
 
Join Date: Aug 2008
Location: Leipzig, Germany
Posts: 3,641
#12: Jan 19 '09

re: How to import javascript in xsl


do these units have their own node?
Newbie
 
Join Date: Jan 2009
Location: Denmark
Posts: 13
#13: Jan 19 '09

re: How to import javascript in xsl


I just need a solution, no matter how to do it. Right now I made it as an array in javascript:
var ISOUOM= new Array("KGM","MTR","LTR","CT");
var MESUOM= new Array("KG","M","L","KAR");
Dormilich's Avatar
Moderator
 
Join Date: Aug 2008
Location: Leipzig, Germany
Posts: 3,641
#14: Jan 19 '09

re: How to import javascript in xsl


it really depends on how these values are stored in the xml. for instance it is possible to convert them with a <choose> construct. if you use a programming language to do the xsl conversion, you may use its string replace functions to convert the units before (or after) the transformation....
Newbie
 
Join Date: Jan 2009
Location: Denmark
Posts: 13
#15: Jan 19 '09

re: How to import javascript in xsl


Hi Dormilich,
It is good to discuss my problem with you.
However, the list of UOM can very long, so it is not so good to use <choose>. I could not find not how to use string replace functions? What do you mean?
Regards
Xin
Dormilich's Avatar
Moderator
 
Join Date: Aug 2008
Location: Leipzig, Germany
Posts: 3,641
#16: Jan 20 '09

re: How to import javascript in xsl


Quote:

Originally Posted by maxin View Post

I could not find not how to use string replace functions? What do you mean?

that's probably best explained with an example. I use PHP as programming language (because I'm used to it, but it works for every other language too, except that the names & functions differ)
Expand|Select|Wrap|Line Numbers
  1. // xml input file
  2. $xml_in = "idoc.xml";
  3.  
  4. // now do the unit replacement
  5. // loading file to a string
  6. $xml_in_cont = file_get_contents($xml_in);
  7. // replace the unit strings (works with arrays too)
  8. $xml_in_conv = str_replace("MTR", "M", $xml_in_cont);
  9.  
  10. // loading the xslt processor
  11. $proc = new XSLTProcessor;
  12. // ... here comes the loading of the required files (left out)
  13. $xml_out_cont = $proc->transformToXML();
  14.  
  15. // saving file to disc
  16. $xml_out = file_put_contents("b2mml.xml", $xml_out_cont);
you use a programm to get the file into string, use the appropriate functions to replace the units, do the xsl transformation, and save the result as file.
Reply