浏览器中的XSLT支持


浏览器中的XSLT支持
XSLT(可扩展样式表语言转换)可以对XML进行操作,将其转换成任何基于文本的形式。
XSLT文件称为样式表,由一些模板组成。模板属于XML的某个特性的一部分(使用XPath指定),它可以决定为这一部分输出什么文本。通过为不同的元素和条件定义模板,XSLT样式表变成了一种XML解析器。
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/">
 <html>
  <head>
   <title>Employees</title>
  </head>
  <body>
   <ul>
    <xsl:apply-imports select="*"/>
   </ul>
  </body>
 </html>
</xsl:template>
 
 <xsl:template match = "employee">
 <li><xsl:value-of select="name"/>,<em><xsl:value-of select="@title"/></em></li>
 </xsl:template>
</xsl:stylesheet>
1、IE中的XSLT支持
分别将XML源代码和XSLT文件载入各自的DOM,并使用特有的transformNode()方法:
oXmlDom.load("employees.xml");
oXslDom.load("employees.xslt");
var sResult = oXmlDom.transformNode(oXslDom);
注意:XSLT也可以载入XML DOM因为它也是一种XML格式。

每一个节点都有个transformNode()方法。
sResult = oXmlDom.documentElement.transformNode(oXslDom);
sResult = oXmlDom.documentElement.childNodes[1].transformNode(oXslDom);
sResult = oXmlDom.getElementsByTagName("name")[0].transformNode(oXslDom);
sResult = oXmlDom.documentElement.firstChild.lastChild.transformnode(oXslDom);
如果在非文档元素中调用transformNode(),则从这个点开始转换,但是XSLT样式表能访问包含这个节点的整个XML文档。
在IE中使用XSLT的另外一个比较复杂的方法是,使用XSL模板和处理器。这种方法必须使用MSXML的其他几个ActiveX控件。首先,XSLT文件必须载入到一个自由线程DOM文档中(行为和普通DOM一样,但是线程是安全的)。
var oXslDom = new ActiveXObject("MSXML2.FreeThreadedDOMDocument");
oXslDom.async = false;
oXslDom.load("employees.xsl");
自由线程DOM文档建立并加载好后,必须将其分配到XSL模板中,这是另一个ActiveX对象:
var oTemplate = new ActiveXObject("MSXML2.XSLTemplate");
oTemplate.stylesheet = oXslDom;
然后,可以用XSL模板来创建一个XSL处理器(当然也是另一个ActiveX对象):
var oProcessor = oTemplate.createProcessor();
创建处理器后,将input特性设置为要进行转换的XML DOM节点,然后调用transform()方法:
oProcessor.input = oXmlDom;
oProcessor.transform();
然后从output特性中访问结果字符串:
var sResult = oProcessor.output;
这些代码模仿了transformNode()的功能。

XSLT样式表可以接受传入的参数,并将其用作局部变量。
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:param name="message"/>

<xsl:template match="/">
 <html>
  <head>
   <title>Employees</title>
  </head>
  <body>
   <ul>
    <xsl:apply-templates select="*"/>
   </ul>
   <p>Message:<xsl:value-of select="$message"/></p>
  </body>
 </html>
</xsl:template>

<xsl:template match="employee">
 <li><xsl:value-of select="name"/>,<em><xsl:value-of select="@title"/>
 </em></li>
</xsl:template>

</xsl:stylesheet>
第一行<xsl:param/>元素,定义了message的参数,第二行通过<xsl:value-of/>元素输出message(美元符号表示这个是局部变量,而不是特性)。
要设置message的值,可在调用transform()前使用addParameter()方法。AddParameter()方法有两个参数,要设置的参数的名称(与<xsl:param/>中指定的一样)以及分配给它的值(一般是字符串,不过也可以是数字或者是布尔值):
oProcessor.input = oXmlDom.documentElement;
oProcessor.addParameter("message","Hello World!");
oProcessor.transform();
另一个XSL处理器的高级特性是,设置操作的模式的能力。在XSLT中,可以定义模板的模式。定义mode后,除非<xsl:apply-template/>指定按照mode特性进行调用,否则模板不会运行。例如:
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:param name="message"/>

<xsl:template match="/">
 <html>
  <head>
   <title>Employees</title>
  </head>
  <body>
   <ul>
    <xsl:apply-templates select="*"/>
   </ul>
   <p>Message:<xsl:value-of select="$message"/></p>
  </body>
 </html>
</xsl:template>

<xsl:template match="employee">
 <li><xsl:value-of select="name"/>,<em><xsl:value-of select="@title"/>
 </em></li>
</xsl:template>
<xsl:template match="employee" mode="position-first">
 <li><em><xsl:value-of select="@title"/></em>,<xsl:value-of select="name"/></li>
</xsl:template>

</xsl:stylesheet>
如果用这个样式表,并使用JavaScript将模式设置为“position-first”,则先输出雇员的位置:
oProcessor.input = oXmlDom;
oProcessor.addParameter("message","Hello World!");
oProcessor.setStartMode("position-first");
oProcessor.transform();
setStartMode()方法只接受一个参数,要设置的模式。与addParameter()一样,必须在transform()之前调用。
如果要使用同一个样式表进行多次转换,则可在每次转换后重置处理器。调用reset()方法,输入和输出特性则会被清除,处理器又可以使用了。
oProcessor.reset();
因为处理器已经编译过XSLT样式表,这要比重复调用transformNode()快得多。

2、Mozilla中XSLT支持
转换过程的第一步是将XML和XSLT载入DOM:
oXmlDom.load("employees.xml");
oXslDom.load("employees.xslt");
然后,创建XSLTProcessor并使用importStylesheet()方法来分配XSLTDOM:
var oProcessor = new XSLTProcessor();
oProcessor.importSytlesheet(oXslDom);
最后一步是调用transformToDocument()或者transformToFragment(),并以XML DOM为参数,最后返回结果。transformToDocument()返回的是新的DOM文档,transformToFragment()返回新的文档碎片,一般来说,应该使用transformToDocument(),除非你想直接将结果添加到某个已经存在的文档中,后一种情况才使用transformToFragment()。
使用transformToFragment()时,仅传入XML DOM并将结果作为另一个完整不同的DOM。
var oResultDom = oProcessor.transformToDocument(oXmlDom);
alert(oResultDom.xml);
使用transformToFragment()时,传入XML DOM和要添加到结果的文档。这确保了新的文档碎片在目标文档中是有效的。
var oResultFragment = oProcessor.transformToFragement(oXmlDom,document);
var oDiv = document.getElementById("divResult");
oDiv.appendChild(oResultFragment);
如果输出的是文本方式,Mozilla创建了单个元素的XML文档<transformiix:result/>,包含了所有输出的文本。所以,从XSLT文件中使用文本输出也产生有效的文档或者文档碎片。

 

 

posted @ 2009-09-13 20:46  flora_asp.net  阅读(457)  评论(0编辑  收藏  举报