JaveScript 中使用 XSLT轉換XML文檔

来源:https://www.cnblogs.com/xixiuling/archive/2018/12/13/10116108.html
-Advertisement-
Play Games

我們經常將數據存儲在XML 中,在展示的時候需要轉換為其它的形式,這裡介紹使用XSLT 對XML數據進行轉換。 要學習XSLT對XML的轉換,需要先瞭解三個文件。 第一個是存儲數據的XML文件:employees.xml 第二個是存儲XSLT的文件:employees.xslt 第三個是我們進行轉換 ...


我們經常將數據存儲在XML 中,在展示的時候需要轉換為其它的形式,這裡介紹使用XSLT 對XML數據進行轉換。

要學習XSLT對XML的轉換,需要先瞭解三個文件。

第一個是存儲數據的XML文件:employees.xml

<?xml version="1.0"?>
<employees>
    <employee title="Software Engineer">
        <name>Nicholas C. Zakas</name>
    </employee>
    <employee title="Salesperson">
        <name>Jim Smith</name>
    </employee>
</employees>

第二個是存儲XSLT的文件:employees.xslt

<?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="/">
       <ul>
           <xsl:apply-templates select="*" />
       </ul>
    </xsl:template>

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

</xsl:stylesheet>

第三個是我們進行轉換的代碼example.htm:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <title>XSLTProcessor Example</title>   
 5 
 6     <script type="text/javascript">
 7         window.onload = function () {
 8         
 9             //use XHR to load
10             var xmlhttp = new XMLHttpRequest();
11             xmlhttp.open("get", "employees.xml", false);
12             xmlhttp.send(null);
13             var xmldom = xmlhttp.responseXML;
14             
15             xmlhttp = new XMLHttpRequest();
16             xmlhttp.open("get", "employees.xslt", false);
17             xmlhttp.send(null);
18             var xsltdom = xmlhttp.responseXML;  
19 
20             var processor = new XSLTProcessor();
21             processor.importStylesheet(xsltdom);
22 
23             var result = processor.transformToDocument(xmldom);
24             var div = document.getElementById("divResult");
25             
26             var xml = (new XMLSerializer()).serializeToString(result);
27             alert(xml);
28             div.innerHTML = xml;
29 
30         }
31     </script>           
32 </head>
33 <body>
34     <p>This example loads employees.xml and transforms it using employees.xslt. 
35     The resulting code is then displayed.</p>
36     <div id="divResult"></div>
37 </body>
38 </html>

在這裡我們通過 XSLTProcessor 類型使用XSLT轉換XML文檔,第一步載入兩個DOM文檔,一個基於XML,另一個基於XSLT,下麵的代碼在Edge 中可以順利執行,在Chrome中,因為禁止從本地裝載文件隨意會會失敗,如果從網路伺服器上讀取數據則沒有問題。

//use XHR to load
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("get", "employees.xml", false);
xmlhttp.send(null);
var xmldom = xmlhttp.responseXML;
            
xmlhttp = new XMLHttpRequest();
xmlhttp.open("get", "employees.xslt", false);
xmlhttp.send(null);
var xsltdom = xmlhttp.responseXML;  

 

然後創建一個新XSLTProcessor對象,並使用importStylesheet()方法為其指定一個XSLT

var processor = new XSLTProcessor();
processor.importStylesheet(xsltdom);

 最後一步是執行轉換,這一步有兩種不同的方式,如果想返回一個完整的DOM文檔,可以調用transformToDocument().而通過調用transforToFragment()則可以得到一個文檔片段對象。一般來說。使用transformToFragment()的唯一理由,就是你想把返回的結果添加到另一個DOM文檔中。

在使用transforToDocument()時,只要傳入XML DOM,就可以將結果作為一個完全不同的DOM文檔來使用。來看例子

var result = processor.transformToDocument(xmldom);

我們將result 結果進行序列化

var xml = (new XMLSerializer()).serializeToString(result);

來看轉換後的結果

<ul>
<li>Nicholas C. Zakas, <em>Software Engineer</em></li>
<li>Jim Smith, <em>Salesperson</em></li>
</ul>

下麵我們來看一下XSLT中的定義:

下麵的這段代碼會讓我們將所有的內容都放到<ul></ul>之中,之所以會這樣是因為我們的選擇符指定了全部 select="*"

<xsl:template match="/">
       <ul>
           <xsl:apply-templates select="*" />
       </ul>
</xsl:template>

下麵這段代碼的含義是對 employee 元素進行轉換 match="employee"

將name 元素放到<li></li>中  select="name"

將title 屬性提取出來放到<em></em>中  select="@title"

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

 

而transformToFragment()方法接收兩個參數:要轉換的XML DOM 和應該擁有結果片段的文檔。換句話說,如果你想將返回的片段插入到頁面中,只要將document作為第二個參數即可。

我們只需要將example.htm中 23 - 28 行代碼替換成下麵代碼就可以了。

var fragment = processor.transformToFragment(xmldom, document);
var div = document.getElementById("divResult");
            
div.appendChild(fragment);

這裡,處理器創建了一個有document對象擁有的片段。這樣,就可以將返回的片段添加到頁面中已有的<div>元素中了。

在XSLT樣式表的輸出格式為"xml","html"的情況下,創建文檔或文檔片段會非常有用。

 

1.使用參數

XSLTProcessor 也支持使用 setParameter()來設置XSLT的參數,這個方法接收三個參數:命名空間URI,參數的內部名稱和要設置的值。通常,命名空間URI都是null,而內部名稱就是參數的名稱。另外必須在調用transformToDocument()或transformToFragment()之前調用這個方法。來看例子

我們先看XSLT文件 employees2.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="/">
       <ul>
           <xsl:apply-templates select="*" />
       </ul>
       <p>Message: <xsl:value-of select="$message" /></p>
    </xsl:template>

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

</xsl:stylesheet>

針對 example.htm的修改

第16行替換為

xmlhttp.open("get", "employees2.xslt", false);

第23 - 28替換為下麵代碼

processor.setParameter(null, "message", "Hello World!");

var fragment = processor.transformToFragment(xmldom, document);
var div = document.getElementById("divResult");
            
div.appendChild(fragment);            

我們看運行後的結果:通過轉換將模板中的 $message變數替換成了我們傳入的參數"Hello World!"

<div id="divResult"><ul>
<li>Nicholas C. Zakas, <em>Software Engineer</em></li>
<li>Jim Smith, <em>Salesperson</em></li>
</ul>
<p>Message: Hello World!</p>
</div>

還有兩個與參數有關的方法,getParamenter()和removeParamenter(),分別用於取得和一處當前參數的值。這兩個方法都要接受命名空間參數和參數內部i名稱。例如

var processor = new XSLTProcessor();
processor.importStylesheet(xsltdom);
processor.setParameter(null, "message", "Hello World!");

alert(processor.getParaeter(null,"message")); //輸出 “Hello World!"
processor.removeParameter(null,"message");
var fragment = processor.transformToFragment(xmldom, document);

這兩個方法並不常用。

 

2.重置處理器

每個XSLTProcessor 的實例都可以重用,以便使用不同的XSLT樣式表執行不同的轉換。重置處理器時要調用reset()方法,這個方法會從處理器中移除所有的參數和樣式表。然後,你就可以再次調用importStylesheet(),以載入不同的XSLT樣式表,如下麵的例子

var processor = new XSLTProcessor();
processor.importStylesheet(xsltdom);

//執行轉換

processor.reset();
processor.importStylesheet(xsltdom2);

//在執行轉換

在需要基於多個樣式表進行轉換時,重用一個XSLTProcessor可以節省記憶體。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 說明: 1.該文主要介紹如何使用NSURLSession來發送GET請求和POST請求 2.本文將不再講解NSURLConnection的使用,如有需要瞭解NSURLConnection如何發送請求。 詳細信息,請參考:http://www.cnblogs.com/wendingding/p/381 ...
  • 簡單說明:建議提交用戶的隱私數據一定要使用Post請求 相對Post請求而言,Get請求的所有參數都直接暴露在URL中,請求的URL一般會記錄在伺服器的訪問日誌中,而伺服器的訪問日誌是黑客攻擊的重點對象之一 用戶的隱私數據如登錄密碼,銀行帳號等 示例代碼 ...
  • stringByAddingPercentEscapesUsingEncoding(只對 `#%^{}[]|\"<> 加空格共14個字元編碼,不包括”&?”等符號), ios9將淘汰,建議用 stringByAddingPercentEncodingWithAllowedCharacters 方法 ...
  • 1、view ...
  • 一.URL 1.基本介紹 URL的全稱是Uniform Resource Locator(統一資源定位符) ,通過1個URL,能找到互聯網唯一的1個資源 ,URL就是資源的地址,位置,互聯網上的每個資源都有一個唯一的URL 2.URL中常見的協議 (1)HTTP: 超文本傳輸協議,訪問的是遠程的網路 ...
  • 一.ios應用常用的數據存儲方式 1.plist(XML屬性列表歸檔) 2.偏好設置 3.NSKeydeArchiver歸檔(存儲自定義對象) 4.SQLite3(資料庫,關係型資料庫,不能直接存儲對象,要編寫一些資料庫的語句,將對象拆分存儲) 5.Core Data(對象型的資料庫,把內部環節屏蔽 ...
  • 動畫及陰影 一.拼接網頁 二.過渡 三.陰影 四.偽類實現邊框 ...
  • html文檔結構 1.<!doctype html>聲明為html5文件,必須是html文檔的第一行,在<html>標簽之前; 2.<html>、</html>是文檔開始和結束的標記,是HTML頁面的根元素,在它們之間是文檔的頭部(head)和主體(body); 3.<head>、</head>定義 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...