addParameter javascript(用于xslt)函数不起作用

时间:2010-11-04 21:01:32

标签: javascript xml xslt

我正在尝试使用javascript调用的xml来查询xslt文件。

这是主页:

<html>
 <head>
 <script>
 function loadXMLDoc(dname)
 {
 if (window.XMLHttpRequest)
   {
   xhttp=new XMLHttpRequest();
   }
 else
   {
   xhttp=new ActiveXObject("Microsoft.XMLHTTP");
   }
 xhttp.open("GET",dname,false);
 xhttp.send("");
 return xhttp.responseXML;
 }

 function displayResult()
 {
 xml=loadXMLDoc("FooBar.xml");
 xsl=loadXMLDoc("FooBar.xsl");
 // code for IE
 if (window.ActiveXObject)
   {
   ex=xml.transformNode(xsl);
   document.getElementById("Main").innerHTML=ex;
   }
 // code for Mozilla, Firefox, Opera, etc.
 else if (document.implementation && document.implementation.createDocument)
   {
   xsltProcessor=new XSLTProcessor();
   xsltProcessor.addParameter("numFoobar","2");
   xsltProcessor.importStylesheet(xsl);

   resultDocument = xsltProcessor.transformToFragment(xml,document);
   document.getElementById("Main").appendChild(resultDocument);
   }
 }
 </script>
 </head>
 <body onload="displayResult()">
 <div id="Main">
 </div>
 </body>
</html>

xml文件很简单:

<?xml version="1.0" standalone="yes"?>
<Foobars xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <Foobar>
    <numFoobar>1</numFoobar>
    <nameFoobar>Foo</numFoobar>
 </Foobar>
<Foobar>
    <numFoobar>2r</numFoobar>
    <nameFoobar>Bar</nameFoobar>
 </Foobar>
</Foobars>

xslt

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <html>
  <body>
    <table border="2" bgcolor="yellow">
      <tr>
        <th>Num</th>
        <th>Name</th>
      </tr>
      <xsl:param name="numFoobar"
      <xsl:for-each select="Foobars/Foobar">
      <tr>
        <td><xsl:value-of select="numFoobar"/></td>
        <td><xsl:value-of select="nameFoobar"/></td>
      </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

如您所见,在xslt文件中我添加了参数。我在javascript中使用它来按numFoobar过滤。

问题是Safari返回错误:

TypeError: Result of expression 'xsltProcessor.addParameter' [undefined] is not a function.

那么,为什么addParameter无法识别?

谢谢,

问候。

3 个答案:

答案 0 :(得分:3)

来自https://developer.mozilla.org/en/The_XSLT/JavaScript_Interface_in_Gecko:Setting_Parameters

  

XSLT提供了xsl:param元素,   这是xsl:stylesheet的子代   元件。 XSLTProcessor()提供   三种JavaScript方法进行交互   使用以下参数:setParameter,   getParameterremoveParameter。他们   所有人都把它作为第一个论点   xsl:param的名称空间URI   (通常情况下,参数将落入   默认命名空间,所以传入   “null”就足够了。)本地名称   xsl:param是第二个   论点。 setParameter需要一个   第三个论点 - 即价值   参数将被设置。

我找不到Opera(Presto),Safari和Chrome(Webkit)的文档。随意编辑这个答案。

答案 1 :(得分:1)

扎卡瑞亚,

除了您提到的错误(@Alejandro明显已解决),您的<xsl:param name="numFoobar" />不在有效位置。

为了使它成为样式表参数,它必须位于顶层:它必须位于<xsl:stylesheet>下的所有模板之前:

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:param name="numFoobar" />
  <xsl:template match="/">
    ...

答案 2 :(得分:0)

您的XML文件必须包含以下标题:

XML yourFile.XML

<?xml version="1.0"  encoding="UTF-8"?>
 <?xml-stylesheet href="yourFile.xsl" type="text/xsl"?>

Javascript HTML yourFile.html here my Iram使用myParam作为变量

else if (document.implementation && document.implementation.createDocument)

{ xsltProcessor = new XSLTProcessor(); xsltProcessor.importStylesheet(xsl);
xsltProcessor.setParameter(null, "numFoobar", "2"); resultDocument = xsltProcessor.transformToFragment(xml, document); document.getElementById("transformResult").appendChild(resultDocument); }

XSLT最后是yourFile.XLST

<xsl:output method="html"/> 
 <xsl:param name="numFoobar" /> 
 <xsl:template match="/">
 <xsl:for-each select="Foobars/Foobar">  
 <tr>
     <td><xsl:value-of select="$numFoobar"/></td>

分三步

  1. XML标题<?xml-stylesheet href="yourFile.xsl" type="text/xsl"?>
  2. 使用setParemeter(null,numFoobar,'2');
  3. 的Javascript
  4. XSLT将您的xsl:param添加到顶层,生成XHTML文件。