使用xsl调用用javascript编写的用户定义函数

时间:2015-06-25 07:17:48

标签: javascript xslt

我在XSL样式表中有一个javascript。在javascript中,我有一个函数getName(node)。 我如何在我的xsl中调用它? 我之前使用过xsl:eval = getname(this)。它一直工作到IE8。 Hasnt从IE9开始工作。 我可以使用xsl:value-of-select吗?或任何其他提示使其工作? 提前谢谢。

    <xsl:script language='JavaScript'><![CDATA[

    var sSobeysRegion = "Sobeys West";
    var sReceiverID = "SOBEYSCANADA:ZZ";
    var ATLANTIC = "Sobeys Atlantic";
    var WEST = "Sobeys West";
    var QUEBEC = "Sobeys Quebec";
    var ONTARIO = "Sobeys Ontario";
    var option1 = ATLANTIC ;
    var option2 = WEST ;
    var option3 = QUEBEC ;
    var option4 = ONTARIO ;

    function getRegion(sVar)
    {
        if (sVar == sSobeysRegion) {
            return true;
        }
        else {
            return false;
        }
    }

    function setReceiverID(sTmp)
    {
        if (sTmp == "Sobeys Atlantic") {
            sReceiverID = "SOBNBTATLTST:ZZ";
            option1 = ATLANTIC;
            option2 = WEST;
            option3 = ONTARIO;
            option4 = QUEBEC;
        }
        else if (sTmp == "Sobeys West") {
            sReceiverID = "SOBNBTWSTTST:ZZ";
            option2 = ATLANTIC;
            option1 = WEST;
            option3 = QUEBEC;
            option4 = ONTARIO;
        }
        else if (sTmp == "Sobeys Quebec") {
            sReceiverID = "SOBNBTQUETST:ZZ";
            option2 = ATLANTIC;
            option3 = WEST;
            option4 = ONTARIO;
            option1 = QUEBEC;
        }
        else if (sTmp == "Sobeys Ontario") {
            sReceiverID = "SOBNBTONTTST:ZZ";
            option2 = ATLANTIC;
            option3 = WEST;
            option1 = ONTARIO;
            option4 = QUEBEC;
        }
    }
    function getRegionValue(Node)
    {
        var sRegion = "TESTID";
        var xmldoc = Node.ownerDocument;
        var root = xmldoc.documentElement;

        sRegion = root.getAttribute("Region");

        sSobeysRegion = sRegion;
        setReceiverID(sSobeysRegion)

//      return sRegion;
        return "";
    }
    var iLineItemCount = 0;

    function addLineItemCount()
    {
        ++iLineItemCount;

        return iLineItemCount;
    }
    function getLineItemCount()
    {
        return iLineItemCount;
    }

    function getEditNodeName(Node)
    {
        var sTmp = "";
//      var xmldoc = Node.ownerDocument;
//      var root = xmldoc.documentElement;
//      var attribute = null;

//      sTmp = Node.nodeName;

//      attribute = xmldoc .createAttribute("EditItemCount");
//      Node.setAttributeNode(attribute);
//      Node.setAttribute("EditItemCount", getEditItemCount());

        //attribute = Node.getAttributeNode();
//      sTmp += ", " + Node.getAttribute("EditItemCount");
//      sTmp += ", document.form." + Node.nodeName + Node.getAttribute("EditItemCount") + ".value";
//      sTmp = "this";

        sTmp = "this, " + getIndex(Node);

        return sTmp;
    }
    function getName(Node)
    {
        var sTmp = "";

        sTmp =  Node.nodeName;

        return sTmp;
    }

    function getValue(Node)
    {
        var sTmp = "";

        if (Node.childnodes(0)!= null) {
            sTmp = Node.childnodes(0).nodeValue;
        }
        return sTmp;
    }
    function setValue(Node, sValue)
    {


    }
    function TransformDate(Node)
    {
        var sTmp = 0;
        var sDate = "";

        sTmp = Node.childnodes(0).nodeValue;

        sDate = sTmp.substring(4,6) + "/" + sTmp.substring(6,8) + "/" + sTmp.substring(0,4);

        return sDate;
    }
    var iLineCount = 0;
    function getLineCount(Node)
    {
        ++iLineCount;

        return iLineCount;
    }
    var iEditItemCount = 0;

    function getEditItemCount(Node)
    {
        ++iEditItemCount;

        return iEditItemCount;
    }
                function getIndex(node)
                {
                    var iCount = 0;
                    var previousNode = null;

                    while(node.parentNode != null){
                        previousNode =  node.previousSibling;
                        while(previousNode != null){
                            if ((previousNode.nodeName != "#document") && (previousNode.nodeName != "xml")
                            && (previousNode.nodeName != "xml-stylesheet")) {
                                iCount += countChildren(previousNode);
//                                  sValue += previousNode.nodeName + "%";
                                    ++iCount;
                            }
                            previousNode =  previousNode.previousSibling;
                        }

                        node = node.parentNode;
                        if (node.nodeName != "#document") {
                            ++iCount;
//                          sValue += node.nodeName + "*"
                        }
                    }
                    return(iCount);
                }
                function countChildren(node)
                {
                    var iCount = 0;
                    var iTotal = 0;
                    var intNode = 0;

                    iCount = node.childNodes.length;

                    if (iCount > 0) {
                        for (intNode = 0; intNode < iCount; intNode++) {
                          if (node.childNodes(intNode).nodeName != "#text") {
                              iTotal += countChildren(node.childNodes(intNode));
//                             sValue += node.childNodes(intNode).nodeName + "&";
                               ++iTotal;

                          }
                        }
                    }
                    return(iTotal);
                }
                function showNext()
                {
                }

]]></xsl:script>

这是xsl:script块中存在的javascript。 对此功能的调用如下。

`enter code here`


    <xsl:template match="SAC_SAC_01_248">
<xsl:element name='select'>
    <xsl:attribute name='class'>select</xsl:attribute>
    <xsl:attribute name='name'><xsl:value-of-select = "getName(this)">/></xsl:attribute>
    <xsl:attribute name='defaultvalue'><xsl:value-of-select = "getValue(this)"/></xsl:attribute>
    <xsl:attribute name='style'>color: black; font-size: 10px;font-weight: normal;font-family: Verdana, Arial, Helvetica, sans-serif</xsl:attribute>
    <xsl:attribute name='onchange'>onNewCodeChange(<xsl:value-of-select = "getEditNodeName(this)"/>, 2)</xsl:attribute>
    <xsl:element name='Option'>
                <xsl:attribute name='value'></xsl:attribute>
    </xsl:element>
    <xsl:element name='Option'>
                <xsl:attribute name='value'>A</xsl:attribute>
                A
    </xsl:element>
    <xsl:element name='Option'>
                <xsl:attribute name='value'>C</xsl:attribute>
                C
    </xsl:element>
</xsl:element>
</xsl:template>

1 个答案:

答案 0 :(得分:1)

这就是我在XSLT 1.0中调用JScript方法的方法:

将以下两个名称空间(xmlns)添加到样式表的顶部:

xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:jscript="http://www.transvision.dk"

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:jscript="http://www.url.com"
exclude-result-prefixes="msxsl jscript">

使用 jscript 命名空间在代码中编写javascript代码:

<msxsl:script language="JScript" implements-prefix="jscript">
function getRegion(sVar){
...
}
</msxsl:script>

调用javascript方法时,请记住使用 jscript 命名空间:

<xsl:value-of select="jscript:getRegion(string($sVar))"/>