我正在尝试使用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
无法识别?
谢谢,
问候。
答案 0 :(得分:3)
来自https://developer.mozilla.org/en/The_XSLT/JavaScript_Interface_in_Gecko:Setting_Parameters
XSLT提供了xsl:param元素, 这是xsl:stylesheet的子代 元件。
XSLTProcessor()
提供 三种JavaScript方法进行交互 使用以下参数:setParameter
,getParameter
和removeParameter
。他们 所有人都把它作为第一个论点 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>
分三步
<?xml-stylesheet href="yourFile.xsl" type="text/xsl"?>
setParemeter(null,numFoobar,'2');
xsl:param
添加到顶层,生成XHTML文件。