How to import javascript in xsl | Newbie | | Join Date: Jan 2009 Location: Denmark
Posts: 13
| |
Hi,
I write a javascript function in xsl (UOMConversion.xsl) as follow: - <?xml version="1.0"?>
-
<xsl:stylesheet version="1.0"
-
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-
-
<script language="Javascript">
-
<![CDATA[
-
var ISOUOM= new Array("KGM","MTR","LTR","CT");
-
var MESUOM= new Array("KG","M","L","KAR");
-
-
function UOMISOTOMES(UOMIn) {
-
var i;
-
var UOMOut;
-
for (i=0; i<=ISOUOM.length; i++)
-
{
-
if (UOMIn == ISOUOM[i]) {
-
UOMOut = MESUOM[i];
-
}
-
}
-
return UOMOut;
-
}
-
]]>
-
</script>
-
</xsl:stylesheet>
I would like to import above UOMConversion.xsl into a xsl (LibUserFunctions.xsl). I write: - <xsl:stylesheet version="1.0"
-
xmlns:xs="http://www.w3.org/2001/XMLSchema"
-
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-
-
<xsl:import href="UOMConversion.xsl"/>
-
....
-
</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
|  | Moderator | | Join Date: Aug 2008 Location: Leipzig, Germany
Posts: 3,641
| | | re: How to import javascript in xsl Quote:
Originally Posted by maxin 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
| | | re: How to import javascript in xsl
I also used date function EXSLT. The date.msxsl.xsl has also some javascript as - <?xml version="1.0"?>
-
<xsl:stylesheet version="1.0"
-
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-
xmlns:date="http://exslt.org/dates-and-times"
-
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
-
extension-element-prefixes="date msxsl">
-
-
<msxsl:script language="Javascript" implements-prefix="date">
-
<![CDATA[
-
...
-
]]>
-
</msxsl:script>
-
</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
| | | 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: -
<?xml version="1.0" encoding="UTF-8" ?>
-
<?xml-stylesheet type="text/xsl" href="LOIPRO01_2_B2MML.xsl"?>
-
<LOIPRO01>
-
<MEINS>MTR</MEINS>
-
</LOIPRO01>
-
The LOIPRO01_2_B2MML.xsl is: -
<?xml version="1.0" encoding="UTF-8"?>
-
<xsl:stylesheet version="1.0"
-
xmlns:xs="http://www.w3.org/2001/XMLSchema"
-
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-
xmlns="http://www.yyy.com/ad/mes/b2mt-1.0"
-
xmlns:bml="http://www.wbf.org/xml/b2mml-v02"
-
xmlns:LibUserFunctions="http://www.yyy.com/UDF/LibUserFunctions"
-
exclude-result-prefixes="xs xsl xsi LibUserFunctions">
-
-
<xsl:import href="LibUserFunctions.xsl"/>
-
-
<xsl:template match="/LOIPRO01">
-
<bml:UnitOfMeasure>
-
<xsl:call-template name="LibUserFunctions:ISOUOMToMESUOM">
-
<xsl:with-param name="UOM" select="MEINS"/>
-
</xsl:call-template>
-
</bml:UnitOfMeasure>
-
</xsl:template>
-
</xsl:stylesheet>
-
and function ISOUOMToMESUOM is in the imported xsl LibUserFunctions.xsl: -
<?xml version="1.0" encoding="UTF-8"?>
-
<xsl:stylesheet version="1.0"
-
xmlns:xs="http://www.w3.org/2001/XMLSchema"
-
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-
xmlns:date="http://exslt.org/dates-and-times" extension-element-prefixes="date"
-
xmlns:log="http://www.xxx.com"
-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-
xmlns:LibUserFunctions="http://www.yyy.com/UDF/LibUserFunctions"
-
exclude-result-prefixes="xs xsl xsi LibUserFunctions">
-
-
<xsl:import href="UOMConversion.xsl"/>
-
-
<xsl:template name="LibUserFunctions:ISOUOMToMESUOM">
-
<xsl:param name="UOM"/>
-
<xsl:value-of select="log:UOMISOTOMES($UOM)"/>
-
</xsl:template>
-
</xsl:stylesheet>
-
the function log:UOMISOTOMES is in the imported UOMConversion.xsl: -
<?xml version="1.0"?>
-
<xsl:stylesheet version="1.0"
-
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-
xmlns:log="http://www.xxx.com"
-
xmlns:msxsl="urn:schemas-microsoft-com:xslt">
-
-
<msxsl:script language="Javascript" implements-prefix="log">
-
<![CDATA[
-
var ISOUOM= new Array("KGM","MTR","LTR","CT");
-
var MESUOM= new Array("KG","M","L","KAR");
-
function UOMISOTOMES(UOMIn) {
-
var i;
-
var UOMOut;
-
for (i=0; i<=ISOUOM.length; i++)
-
{
-
if (UOMIn == ISOUOM[i]) {
-
UOMOut = MESUOM[i];
-
}
-
}
-
return UOMOut;
-
}
-
]]>
-
</msxsl:script>
-
</xsl:stylesheet>
-
Regards
maxin
|  | Moderator | | Join Date: Aug 2008 Location: Leipzig, Germany
Posts: 3,641
| | | re: How to import javascript in xsl Quote:
Originally Posted by maxin 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) - l = array.length;
-
for (i=0; i<l; i++) { ... }
| | Newbie | | Join Date: Jan 2009 Location: Denmark
Posts: 13
| | | 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
| | | 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
|  | Moderator | | Join Date: Aug 2008 Location: Leipzig, Germany
Posts: 3,641
| | | re: How to import javascript in xsl Quote:
Originally Posted by maxin 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
| | | 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.
|  | Moderator | | Join Date: Aug 2008 Location: Leipzig, Germany
Posts: 3,641
| | | 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
| | | 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.
|  | Moderator | | Join Date: Aug 2008 Location: Leipzig, Germany
Posts: 3,641
| | | re: How to import javascript in xsl
do these units have their own node?
| | Newbie | | Join Date: Jan 2009 Location: Denmark
Posts: 13
| | | 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");
|  | Moderator | | Join Date: Aug 2008 Location: Leipzig, Germany
Posts: 3,641
| | | 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
| | | 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
|  | Moderator | | Join Date: Aug 2008 Location: Leipzig, Germany
Posts: 3,641
| | | re: How to import javascript in xsl Quote:
Originally Posted by maxin 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) - // xml input file
-
$xml_in = "idoc.xml";
-
-
// now do the unit replacement
-
// loading file to a string
-
$xml_in_cont = file_get_contents($xml_in);
-
// replace the unit strings (works with arrays too)
-
$xml_in_conv = str_replace("MTR", "M", $xml_in_cont);
-
-
// loading the xslt processor
-
$proc = new XSLTProcessor;
-
// ... here comes the loading of the required files (left out)
-
$xml_out_cont = $proc->transformToXML();
-
-
// saving file to disc
-
$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.
|  | | | | /bytes/about
We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights.
Get the best answers to your questions from over 226,358 network members.
|