与XML和XPath一样,Firefox的XSLT实现与IE中的实现存在许多不同之处。Firefox实现一个XSLTProcessor类来执行转换,不过相似之处也就仅此而已。
Firefox中执行转换的第一步是将XML和XSLT文档载入到DOM对象中:
var oXmlDom = zXmlDom.createDocument();
var oXslDom = zXmlDom.createDocument();
oXmlDom.async = false;
oXslDom.async = false;
oXmlDom.load("books.xml");
oXslDom.load("books.xsl");
XSLTProcessor类公开了importStylesheet()方法,该方法的参数为包含XSLT文档的XML DOM对象:
var oXsltProcessor = new XSLTProcessor();
oXsltProcessor.importStylesheet(oXslDom);
最后调用转换方法。这里有两类方法:transformToDocument()和transformToFragment()。transformToDocument()方法的参数为XML DOM对象,并返回包含转换的新XML DOM文档。通常情况下,将以下述的形式来使用它:
var oNewDom = oXsltProcessor.transformToDocument(oXmlDom);
作为结果返回的DOM对象与其他XML DOM对象的用法类似。可以根据XPath选择特定节点,基于属性和方法遍历节点结构,甚至在另一个转换中使用它。
transformToFragment()方法返回一个文档片段,恰如其名,附加到另一个DOM文档上。该方法需要两个参数:第一个参数是要转换的XML DOM对象,第二个参数是计划附加结果的DOM文档:
var oFragment = oXsltProcessor.transformToFragment(oXmlDom, document);
document.body.appendChild(oFragment);
在示例中,返回结果的文档片段附加到文档对象的主体中。请注意,结果片段可以附加到作为参数传入transformToFragment()方法的DOM对象内的任意节点。
但是如果想像微软的transformNode()方法实现一样,返回的字符串作为转换结果,该怎么样呢?那么可以使用之前介绍的XMLSerializer类。只需要将转换结果作为参数传到serializeToString()方法中:
var oSerializer = new XMLSerializer();
var str = oSerializer.serializeToString(oNewDom);
如果使用zXml库,则只需简单使用xml属性即可:
var str = oFragment.xml;
XSLTProcessor类还可以设置传入XSL样式表的参数。setParameter()方法可以很容易地完成该功能。该方法接受三个参数:命名空间URI、参数名称以及参数值。例如:
oXsltProcessor.importStylesheet(oXslDom);
oXsltProcessor.setParameter(null, "message", "My Book List");
var oNewDom = oXsltProcessor.transformToDocument(oXmlDom);
在该示例中,赋给参数message的值为"My Book List"。第一个参数命名空间URI传入的值为null,那么样式表中的参数就不需要指定前缀和相应的命名空间URI:
<xsl:param name="message" />
setParameter()方法必须在调用transformToDocument()或transformToFragment()前调用,否则转换中就不能使用所设置的参数值。







