导航

XSLT使用<转载>

Posted on 2011-08-03 10:50  kingwangzhen  阅读(200)  评论(0编辑  收藏  举报

1         XSLT知识点

1.1       入门学习网站

http://www.w3school.com.cn/xsl/index.asp

1.2       函数

XSLTXPath,XQuery使用相同的函数库。

http://www.w3school.com.cn/xpath/xpath_functions.asp

1.3       常用的XSLT元素

1.3.1       <xsl:template>

XSL 样式表由一个或多套被称为模板(template)的规则组成。每个模板含有当某个指定的节点被匹配时所应用的规则。

1.3.2       <xsl:value-of>

<xsl:value-of> 元素用于提取某个选定节点的值。如:

<xsl:value-of select="/Data/Books/Book[position()=$pos]/*[name()=$fld]"/>

1.3.3       <xsl:for-each>

<xsl:for-each> 元素允许您在 XSLT 中进行循环。实现数据遍历。类似于C#foreach关键字。

1.3.4       <xsl:if>

<xsl:if> 元素用于放置针对 XML 文件内容的条件测试。类似于C#if关键字,但是在xslt中没有else分支。

<xsl:if test=".&gt;85">

 <xsl:attribute name="style">color:red</xsl:attribute>

</xsl:if>

<xsl:if test=".&lt;60">

 <xsl:attribute name="style">color:blue</xsl:attribute>

</xsl:if>

1.3.5       <xsl:sort>

如需对结果进行排序,只要简单地在 XSL 文件中的 <xsl:for-each> 元素内部添加一个 <xsl:sort> 元素。如:

<xsl:for-each select="catalog/cd">

 <xsl:sort select="artist"/>

 <tr>

    <td>

      <xsl:value-of select="title"/>

    </td>

    <td>

      <xsl:value-of select="artist"/>

    </td>

 </tr>

</xsl:for-each>

1.3.6       <xsl:choose>

XSLT <xsl:choose> 元素用于结合 <xsl:when>  <xsl:otherwise> 来表达多重条件测试。

<xsl:choose>

 <xsl:when test=".&gt;85">优秀</xsl:when>

 <xsl:when test=".&gt;70">一般</xsl:when>

 <xsl:when test=".&gt;60">合格</xsl:when>

 <xsl:otherwise>不合格</xsl:otherwise>

</xsl:choose>

1.3.7       <xsl:apply-templates>

<xsl:apply-templates> 元素可把一个模板应用于当前的元素或者当前元素的子节点。假如我们向 <xsl:apply-templates> 元素添加一个 select 属性,此元素就会仅仅处理与属性值匹配的子元素。我们可以使用 select 属性来规定子节点被处理的顺序。

1.3.8       <xsl:output>

设置xslt的转换输出,如格式htmlxml等,编码utf8,gb2312等。

2         HTMLXSLT

2.1       外部样式表引用

<head></head>标签之间放置如:

<head>

 <link type="text/cssrel="stylesheethref="../HtmlTemplate/common.css" />

</head>

2.2       外部脚本库引用

可以放置到<head></head><body></body>中。如:

<script src="../HtmlTemplate/common.jstype="text/javascript"></script>

2.3       XSLT内部脚本

XSLT内部编写脚本时,需要添加<![CDATA[]]>

<head>

 <link type="text/cssrel="stylesheethref="../HtmlTemplate/common.css" />

 <script src="../HtmlTemplate/common.jstype="text/javascript"></script>

 <script language="JavaScript">

    <![CDATA[

      function showSelected() {

        var ids = [];

        var boxes = tblList.getElementsByTagName("input");

        for (var i = 1; i < boxes.length; i++) {

        if (boxes[i].checked)

            ids.push(boxes[i].bookId);

        }

        document.getElementById("hdIds").value = ids.toString();

        alert(ids);

      }

      ]]>

 </script>

</head>

3         XMLXSLT

现在各种主流浏览器都支持XMLXSLT的转换。可以利用XSLT实现XML从一种结构到另一种结构的转换。

XML文件的开头可以添加指令生命要引用的XSLT文件。这样浏览器就能够根据这个路径去加载XSLT去执行转换,并将结果显示给用户。

<?xml version="1.0encoding="utf-8"?>

<?xml-stylesheet type='text/xsl' href='../HTMLTemplate/DemoComplexList.xslt'?>

 

4         .NetXSLT

.Net中通常采用XsltCompiledTransform类来实现转换,其Transform方法支持很多重载,可以是文件,流,或者读写器等。如:

private static string thruHtml(XDocument xDoc, string xsltFile)

{

    string basePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

    string xsltPath = string.Format("{0}""HTMLTemplate""{1}", basePath, xsltFile);

    string htmlPath = string.Format("{0}""temp""{1}.htm", basePath, Guid.NewGuid());

 

    using (FileStream fs = new FileStream(htmlPath, FileMode.Create))

    {

        XslCompiledTransform transform = new XslCompiledTransform();

        transform.Load(xsltPath);

 

 

        XmlReader xr = xDoc.CreateReader();

 

        transform.Transform(xr, null, fs);

    }

    return htmlPath;

}

5         JavaScriptXSLT

利用XMLDocument对象模型实现转换,如下代码在IE下运行:

<html>

<head>

    <title>CD Catalog</title>

</head>

<body>

 

    <script type="text/javascript">

        // Load XML

        var xml = new ActiveXObject("Microsoft.XMLDOM");

        xml.async = false;

        xml.load("cdcatalog.xml");

 

        // Load XSL

        var xsl = new ActiveXObject("Microsoft.XMLDOM");

        xsl.async = false;

        xsl.load("cdcatalog.xsl");

 

        // Transform

        document.write(xml.transformNode(xsl));

    </script>

 

</body>

</html>