Функция JavaScript addParameter (используется для xslt) не работает - PullRequest
0 голосов
/ 05 ноября 2010

Я пытаюсь запросить файл xml, используя xslt, вызванный javascript.

Вот главная страница:

<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 ]

3 голосов
/ 05 ноября 2010

С https://developer.mozilla.org/en/The_XSLT/JavaScript_Interface_in_Gecko:Setting_Parameters

XSLT предоставляет элемент xsl: param, который является дочерним элементом таблицы стилей xsl: элемент. XSLTProcessor() обеспечивает три метода JavaScript для взаимодействия с этими параметрами: setParameter, getParameter и removeParameter. Oни все принимают в качестве первого аргумента URI пространства имен xsl: param (Обычно параметр попадает в пространство имен по умолчанию, так что передача в «Ноль» будет достаточно.) Местное имя из xsl: param является вторым аргумент. setParameter требует третий аргумент - а именно значение для какой параметр будет установлен.

Я не смог найти документацию для Opera (Presto) или Safari and Chrome (Webkit). Не стесняйтесь редактировать этот ответ.

1 голос
/ 05 ноября 2010

Закария,

Помимо упомянутой вами ошибки (которую, по-видимому, @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="/">
    ...
0 голосов
/ 23 марта 2015

Вы должны иметь следующий заголовок в вашем XML-файле:

XML yourFile.XML

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

Javascript HTML yourFile.html здесь я использовал myParam в качестве переменной

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

{ xsltProcessor = new XSLTProcessor(); xsltProcessor.importStylesheet(xsl);<br> 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. Javascriptс помощью setParemeter(null,numFoobar,'2');
  3. XSLT добавьте xsl:param на верхнем уровне, генерируя файл XHTML.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...