學習 XSLT:XML文檔轉換的關鍵

来源:https://www.cnblogs.com/xiaowange/p/18124805
-Advertisement-
Play Games

XSL(eXtensible Stylesheet Language)是一種用於 XML 的樣式語言。 XSL(T) 語言 XSLT 是一種用於轉換 XML 文檔的語言。 XPath 是一種用於在 XML 文檔中導航的語言。 XQuery 是一種用於查詢 XML 文檔的語言。 它始於 XSL XSL ...


XSL(eXtensible Stylesheet Language)是一種用於 XML 的樣式語言。

XSL(T) 語言

XSLT 是一種用於轉換 XML 文檔的語言。

XPath 是一種用於在 XML 文檔中導航的語言。

XQuery 是一種用於查詢 XML 文檔的語言。

它始於 XSL

XSL 代表 EXtensible Stylesheet Language

CSS = HTML 的樣式表

HTML 使用預定義標簽。每個標簽的含義以及如何顯示已經被充分理解。

CSS 用於向 HTML 元素添加樣式。

XSL = XML 的樣式表

XML 不使用預定義標簽,因此每個標簽的含義並不是很清楚。

一個 <table> 元素可能表示 HTML 表格、一件傢具或其他東西 - 瀏覽器不知道如何顯示它!

因此,XSL 描述了 XML 元素應如何顯示。

XSL - 不僅僅是樣式表語言

XSL 由四個部分組成:

  • XSLT - 用於轉換 XML 文檔的語言
  • XPath - 用於在 XML 文檔中導航的語言
  • XSL-FO - 用於格式化 XML 文檔的語言(已於 2013 年停用)
  • XQuery - 用於查詢 XML 文檔的語言

示例

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
    <h2>My CD Collection</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>Title</th>
        <th>Artist</th>
      </tr>
      <xsl:for-each select="catalog/cd">
        <tr>
          <td><xsl:value-of select="title"/></td>
          <td><xsl:value-of select="artist"/></td>
        </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>

什麼是 XSLT

XSLT 代表 XSL Transformations

XSLT 是 XSL 中最重要的部分

XSLT 將 XML 文檔轉換為另一個 XML 文檔

XSLT 使用 XPath 在 XML 文檔中導航

XSLT = XSL 轉換

XSLT 是 XSL 中最重要的部分。

XSLT 用於將 XML 文檔轉換為另一個 XML 文檔,或者由瀏覽器識別的其他類型的文檔,如 HTML 和 XHTML。通常,XSLT 通過將每個 XML 元素轉換為(X)HTML 元素來實現此目的。

使用 XSLT,您可以向輸出文件添加/刪除元素和屬性。您還可以重新排列和排序元素,執行測試並根據需要隱藏和顯示元素,以及進行更多操作。

描述轉換過程的一種常見方式是說,XSLT 將 XML 源樹轉換為 XML 結果樹。

XSLT 使用 XPath

XSLT 使用 XPath 在 XML 文檔中查找信息。XPath 用於在 XML 文檔中導航元素和屬性。

它是如何工作的

在轉換過程中,XSLT 使用 XPath 定義應與一個或多個預定義模板匹配的源文檔的部分。當找到匹配時,XSLT 將源文檔的匹配部分轉換為結果文檔。

XSLT 瀏覽器支持

所有主要瀏覽器都支持 XSLT 和 XPath

正確的樣式表聲明

聲明文檔為 XSL 樣式表的根元素是 <xsl:stylesheet><xsl:transform>

註意:<xsl:stylesheet><xsl:transform> 完全是同義詞,可以使用任一種

要訪問 XSLT 元素、屬性和特性,我們必須在文檔頂部聲明 XSLT 命名空間。

從原始 XML 文檔開始

以下 XML 文檔("cdcatalog.xml")轉換為 XHTML:

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
  </cd>
.
.
</catalog>

在瀏覽器中查看 XML 文件:打開 XML 文件(單擊下麵的鏈接)- XML 文檔將以帶顏色的根和子元素顯示。通常,元素左側會有一個箭頭或加號/減號符號,點擊它可以展開或摺疊元素結構。提示:要查看原始 XML 源代碼,請右鍵單擊 XML 文件,然後選擇“查看頁面源代碼”!

創建 XSL 樣式表

然後,您可以創建一個 XSL 樣式表("cdcatalog.xsl"),其中包含一個轉換模板

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

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <h2>My CD Collection</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th>Title</th>
      <th>Artist</th>
    </tr>
    <xsl:for-each select="catalog/cd">
    <tr>
      <td><xsl:value-of select="title"/></td>
      <td><xsl:value-of select="artist"/></td>
    </tr>
    </xsl:for-each>
  </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>

將 XSL 樣式錶鏈接到 XML 文檔

將 XSL 樣式表引用添加到您的 XML 文檔("cdcatalog.xml")中:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?>
<catalog>
  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
  </cd>
.
.
</catalog>

如果您的瀏覽器支持 XSLT,它將會將您的 XML 優雅地轉換為 XHTML

XSLT <xsl:template> 元素

一個 XSL 樣式表由一個或多個稱為模板的規則集組成。

模板包含在匹配指定節點時應用的規則。

<xsl:template> 元素

<xsl:template> 元素用於構建模板。

match 屬性用於將模板與 XML 元素關聯起來。match 屬性還可以用於為整個 XML 文檔定義模板。match 屬性的值是一個 XPath 表達式(即 match="/" 定義整個文檔)

示例

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <h2>My CD Collection</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th>Title</th>
      <th>Artist</th>
    </tr>
    <tr>
      <td>.</td>
      <td>.</td>
    </tr>
  </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>

示例解釋

由於 XSL 樣式表是一個 XML 文檔,因此它始終以 XML 聲明開頭:<?xml version="1.0" encoding="UTF-8"?>

接下來的元素 <xsl:stylesheet> 定義了此文檔是一個 XSLT 樣式表文檔(連同版本號和 XSLT 命名空間屬性)。

<xsl:template> 元素定義了一個模板。match="/" 屬性將模板與 XML 源文檔的根關聯起來。

<xsl:template> 元素內部的內容定義了要寫入輸出的一些 HTML。

最後兩行定義了模板的結束和樣式表的結束。

這個示例的結果有點令人失望,因為沒有將任何數據從 XML 文檔複製到輸出中。在下一章中,您將學習如何使用 <xsl:value-of> 元素從 XML 元素中選擇值。

XSLT <xsl:value-of> 元素

<xsl:value-of> 元素用於提取所選節點的值。

<xsl:value-of> 元素

<xsl:value-of> 元素可用於提取 XML 元素的值,並將其添加到轉換的輸出流中:

示例

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <h2>My CD Collection</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th>Title</th>
      <th>Artist</th>
    </tr>
    <tr>
      <td><xsl:value-of select="catalog/cd/title"/></td>
      <td><xsl:value-of select="catalog/cd/artist"/></td>
    </tr>
  </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>

示例解釋

註意:在上面的示例中,select 屬性包含一個 XPath 表達式。XPath 表達式的工作方式類似於導航文件系統;斜杠 (/) 選擇子目錄。

上面示例的結果有點令人失望;只有一行數據從 XML 文檔複製到輸出中。在下一章中,您將學習如何使用 <xsl:for-each> 元素迴圈遍歷 XML 元素,並顯示所有記錄。

XSLT <xsl:for-each> 元素

<xsl:for-each> 元素允許您在 XSLT 中進行迴圈。

<xsl:for-each> 元素

XSL <xsl:for-each> 元素可用於選擇指定節點集的每個 XML 元素:

示例

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <h2>My CD Collection</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th>Title</th>
      <th>Artist</th>
    </tr>
    <xsl:for-each select="catalog/cd">
    <tr>
      <td><xsl:value-of select="title"/></td>
      <td><xsl:value-of select="artist"/></td>
    </tr>
    </xsl:for-each>
  </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>

註意:select 屬性的值是一個 XPath 表達式。XPath 表達式的工作方式類似於導航文件系統;斜杠 (/) 選擇子目錄。

篩選輸出

我們還可以通過向 <xsl:for-each> 元素的 select 屬性添加條件來對 XML 文件中的輸出進行篩選。

<xsl:for-each select="catalog/cd[artist='Bob Dylan']">

合法的篩選操作符有:

  • =(等於)
  • !=(不等於)
  • <(小於)
  • >(大於)

看看調整後的 XSL 樣式表:

示例

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <h2>My CD Collection</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th>Title</th>
      <th>Artist</th>
    </tr>
    <xsl:for-each select="catalog/cd[artist='Bob Dylan']">
    <tr>
      <td><xsl:value-of select="title"/></td>
      <td><xsl:value-of select="artist"/></td>
    </tr>
    </xsl:for-each>
  </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>

XSLT <xsl:sort> 元素

<xsl:sort> 元素用於對輸出進行排序。

排序信息放在哪裡

要對輸出進行排序,只需在 XSL 文件的 <xsl:for-each> 元素內部添加一個 <xsl:sort> 元素:

示例

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <h2>My CD Collection</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th>Title</th>
      <th>Artist</th>
    </tr>
    <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>
  </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>

註意:select 屬性指示要排序的 XML 元素。

XSLT <xsl:if> 元素

<xsl:if> 元素用於根據 XML 文件的內容進行條件測試。

<xsl:if> 元素

要對 XML 文件的內容進行條件 if 測試,請將 <xsl:if> 元素添加到 XSL 文檔中。

語法

<xsl:if test="expression">
  ... 如果表達式為真,則輸出一些內容...
</xsl:if>

<xsl:if> 元素放在哪裡

要添加條件測試,請在 XSL 文件中的 <xsl:for-each> 元素內部添加 <xsl:if> 元素:

示例

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <h2>My CD Collection</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th>Title</th>
      <th>Artist</th>
      <th>Price</th>
    </tr>
    <xsl:for-each select="catalog/cd">
      <xsl:if test="price &gt; 10">
        <tr>
          <td><xsl:value-of select="title"/></td>
          <td><xsl:value-of select="artist"/></td>
          <td><xsl:value-of select="price"/></td>
        </tr>
      </xsl:if>
    </xsl:for-each>
  </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>

註意:所需 test 屬性的值包含要評估的表達式。

上面的代碼只會輸出價格高於 10 的 CD 的標題和藝術家元素。

XSLT <xsl:choose> 元素

<xsl:choose> 元素與 <xsl:when><xsl:otherwise> 結合使用,用於表達多個條件測試。

<xsl:choose> 元素

語法

<xsl:choose>
  <xsl:when test="expression">
    ... 一些輸出 ...
  </xsl:when>
  <xsl:otherwise>
    ... 一些輸出 ....
  </xsl:otherwise>
</xsl:choose>

選擇條件的放置位置

要對 XML 文件進行多個條件測試,請將 <xsl:choose><xsl:when><xsl:otherwise> 元素添加到 XSL 文件中:

示例

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <h2>My CD Collection</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th>Title</th>
      <th>Artist</th>
    </tr>
    <xsl:for-each select="catalog/cd">
    <tr>
      <td><xsl:value-of select="title"/></td>
      <xsl:choose>
        <xsl:when test="price &gt; 10">
          <td bgcolor="#ff00ff">
          <xsl:value-of select="artist"/></td>
        </xsl:when>
        <xsl:otherwise>
          <td><xsl:value-of select="artist"/></td>
        </xsl:otherwise>
      </xsl:choose>
    </tr>
    </xsl:for-each>
  </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>

上述代碼將在 CD 的價格高於 10 時,為“Artist”列添加粉色背景顏色。

另一個示例

以下是包含兩個 <xsl:when> 元素的另一個示例:

示例

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <h2>My CD Collection</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th>Title</th>
      <th>Artist</th>
    </tr>
    <xsl:for-each select="catalog/cd">
    <tr>
      <td><xsl:value-of select="title"/></td>
      <xsl:choose>
        <xsl:when test="price &gt; 10">
          <td bgcolor="#ff00ff">
          <xsl:value-of select="artist"/></td>
        </xsl:when>
        <xsl:when test="price &gt; 9">
          <td bgcolor="#cccccc">
          <xsl:value-of select="artist"/></td>
        </xsl:when>
        <xsl:otherwise>
          <td><xsl:value-of select="artist"/></td>
        </xsl:otherwise>
      </xsl:choose>
    </tr>
    </xsl:for-each>
  </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>

上述代碼將在 CD 的價格高於 10 時為“Artist”列添加粉色背景顏色,併在 CD 的價格高於 9 且低於或等於 10 時為其添加灰色背景顏色。

XSLT <xsl:apply-templates> 元素

<xsl:apply-templates> 元素將一個模板規則應用於當前元素或當前元素的子節點。

<xsl:apply-templates> 元素將一個模板應用於當前元素或當前元素的子節點。

如果我們給 <xsl:apply-templates> 元素添加一個 "select" 屬性,它將僅處理與屬性值匹配的子元素。我們可以使用 "select" 屬性來指定子節點的處理順序。

請看下麵的 XSL 樣式表:

示例

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <h2>My CD Collection</h2>
  <xsl:apply-templates/>
  </body>
  </html>
</xsl:template>

<xsl:template match="cd">
  <p>
  <xsl:apply-templates select="title"/>
  <xsl:apply-templates select="artist"/>
  </p>
</xsl:template>

<xsl:template match="title">
  Title: <span style="color:#ff0000">
  <xsl:value-of select="."/></span>
  <br />
</xsl:template>

<xsl:template match="artist">
  Artist: <span style="color:#00ff00">
  <xsl:value-of select="."/></span>
  <br />
</xsl:template>

</xsl:stylesheet>

XSLT - 在客戶端

XSLT 可以用於在您的瀏覽器中將文檔轉換為 XHTML。通過向 XML 文件添加 XSL 樣式表並讓瀏覽器執行轉換來實現這一點。即使這種方法運行良好,但並不總是希望在 XML 文件中包含樣式表引用(例如,在非 XSLT 感知的瀏覽器中無法工作)。

一個更加靈活的解決方案是使用 JavaScript 來進行轉換。

通過使用 JavaScript,我們可以:

  • 進行瀏覽器特定的測試
  • 根據瀏覽器和用戶需求使用不同的樣式表

這就是 XSLT 的美妙之處!XSLT 的一個設計目標是使其能夠將數據從一種格式轉換為另一種格式,支持不同的瀏覽器和不同的用戶需求。

XML 文件和 XSL 文件

查看您在前幾章中看到的 XML 文檔:

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
  </cd>
.
.
</catalog>

查看 XML 文件

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

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <h2>My CD Collection</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th style="text-align:left">Title</th>
      <th style="text-align:left">Artist</th>
    </tr>
    <xsl:for-each select="catalog/cd">
    <tr>
      <td><xsl:value-of select="title" /></td>
      <td><xsl:value-of select="artist" /></td>
    </tr>
    </xsl:for-each>
  </table>
</xsl:template>

</xsl:stylesheet>

在瀏覽器中將 XML 轉換為 XHTML

以下是在客戶端將 XML 文件轉換為 XHTML 所需的源代碼:

示例

<!DOCTYPE html>
<html>
<head>
<script>
function loadXMLDoc(filename)
{
if (window.ActiveXObject)
  {
  xhttp = new ActiveXObject("Msxml2.XMLHTTP");
  }
else
  {
  xhttp = new XMLHttpRequest();
  }
xhttp.open("GET", filename, false);
try {xhttp.responseType = "msxml-document"} catch(err) {}
xhttp.send("");
return xhttp.responseXML;
}

function displayResult()
{
xml = loadXMLDoc("cdcatalog.xml");
xsl = loadXMLDoc("cdcatalog.xsl");
// IE 瀏覽器的代碼
if (window.ActiveXObject || xhttp.responseType == "msxml-document")
  {
  ex = xml.transformNode(xsl);
  document.getElementById("example").innerHTML = ex;
  }
// Chrome、Firefox、Opera 等其他瀏覽器的代碼
else if (document.implementation && document.implementation.createDocument)
  {
  xsltProcessor = new XSLTProcessor();
  xsltProcessor.importStylesheet(xsl);
  resultDocument = xsltProcessor.transformToFragment(xml, document);
  document.getElementById("example").appendChild(resultDocument);
  }
}
</script>
</head>
<body onload="displayResult()">
<div id="example" />
</body>
</html>

示例解釋

loadXMLDoc() 函數執行以下操作:

  • 創建一個 XMLHttpRequest 對象
  • 使用 XMLHttpRequest 對象的 open() 和 send() 方法向伺服器發送請求
  • 獲取響應數據作為 XML 數據

displayResult() 函數用於顯示由 XSL 文件樣式化的 XML 文件:

  • 載入 XML 和 XSL 文件
  • 測試用戶使用的瀏覽器類型
  • 如果是 Internet Explorer:
    • 使用 transformNode() 方法將 XSL 樣式表應用於 xml 文檔
    • 將當前文檔的 body(id="example")設置為包含樣式化的 xml 文檔
  • 如果是其他瀏覽器:
    • 創建一個新的 XSLTProcessor 對象並將 XSL 文件導入其中
    • 使用 transformToFragment() 方法將 XSL 樣式表應用於 xml 文檔
    • 將當前文檔的 body(id="example")設置為包含樣式化的 xml 文檔

XSLT - 在伺服器端

為了使 XML 數據對所有類型的瀏覽器都可用,我們可以在伺服器上轉換 XML 文檔,並將其作為 XHTML 發送回瀏覽器。

一個跨瀏覽器解決方案

在前一章中,我們解釋瞭如何使用 XSLT 在瀏覽器中將文檔從 XML 轉換為 XHTML。我們使用了 JavaScript 和 XML 解析器進行轉換。但是,在沒有 XML 解析器的瀏覽器中,這種方法將無法工作。

為了使 XML 數據對所有類型的瀏覽器都可用,我們可以在伺服器上轉換 XML 文檔,並作為 XHTML 發送回瀏覽器。

這是 XSLT 的另一個美妙之處。XSLT 的一個設計目標是使其能夠在伺服器上將數據從一種格式轉換為另一種格式,向所有類型的瀏覽器返回可讀數據。

XML 文件和 XSLT 文件

查看您在前幾章中看到的 XML 文檔:

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
  </cd>
.
.
</catalog>

查看 XML 文件

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <h2>My CD Collection</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th style="text-align:left">Title</th>
      <th style="text-align:left">Artist</th>
    </tr>
    <xsl:for-each select="catalog/cd">
    <tr>
      <td><xsl:value-of select="title" /></td>
      <td><xsl:value-of select="artist" /></td>
    </tr>
    </xsl:for-each>
  </table>
</xsl:template>

</xsl:stylesheet>

以下是在伺服器上將 XML 文件轉換為 XHTML 所需的 PHP 源代碼

<?php
// 載入 XML 文件
$xml = new DOMDocument;
$xml->load('cdcatalog.xml');

// 載入 XSL 文件
$xsl = new DOMDocument;
$xsl->load('cdcatalog.xsl');

// 配置轉換器
$proc = new XSLTProcessor;

// 附加 xsl 規則
$proc->importStyleSheet($xsl);

echo $proc->transformToXML($xml);
?>

以下是在伺服器上將 XML 文件轉換為 XHTML 所需的 ASP 源代碼

<%
'載入 XML 文件
set xml = Server.CreateObject("Microsoft.XMLDOM")
xml.async = false
xml.load(Server.MapPath("cdcatalog.xml"))

'載入 XSL 文件
set xsl = Server.CreateObject("Microsoft.XMLDOM")
xsl.async = false
xsl.load(Server.MapPath("cdcatalog.xsl"))

'轉換文件
Response.Write(xml.transformNode(xsl))
%>

XSLT - 編輯 XML

存儲在 XML 文件中的數據可以從 Internet 瀏覽器中進行編輯。

打開、編輯和保存 XML

現在,我們將展示如何打開、編輯和保存存儲在伺服器上的 XML 文件。

我們將使用 XSL 來將 XML 文檔轉換為 HTML 表單。 XML 元素的值將寫入 HTML 表單中的 HTML 輸入欄位中。 HTML 表單是可編輯的。 編輯數據後,數據將被提交回伺服器,XML 文件將被更新(我們將顯示 PHP 和 ASP 的代碼)。

XML 文件和 XSL 文件

首先,看一下 XML 文檔("tool.xml"):

<?xml version="1.0" encoding="UTF-8"?>
<tool>
  <field id="prodName">
    <value>HAMMER HG2606</value>
  </field>
  <field id="prodNo">
    <value>32456240</value>
  </field>
  <field id="price">
    <value>$30.00</value>
  </field>
</tool>

然後,看一下以下樣式表("tool.xsl")

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <form method="post" action="edittool.asp">
  <h2>工具信息(編輯):</h2>
  <table border="0">
    <xsl:for-each select="tool/field">
    <tr>
      <td><xsl:value-of select="@id"/></td>
      <td>
      <input type="text">
      <xsl:attribute name="id">
        <xsl:value-of select="@id" />
      </xsl:attribute>
      <xsl:attribute name="name">
        <xsl:value-of select="@id" />
      </xsl:attribute>
      <xsl:attribute name="value">
        <xsl:value-of select="value" />
      </xsl:attribute>
      </input>
      </td>
    </tr>
    </xsl:for-each>
  </table>
  <br />
  <input type="submit" id="btn_sub" name="btn_sub" value="Submit" />
  <input type="reset" id="btn_res" name="btn_res" value="Reset" />
  </form>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>

上面的 XSL 文件迴圈遍歷 XML 文件中的元素,併為每個 XML "field" 元素創建一個輸入欄位。 XML "field" 元素的 "id" 屬性的值被添加到每個 HTML 輸入欄位的 "id" 和 "name" 屬性中。 每個 XML "value" 元素的值被添加到每個 HTML 輸入欄位的 "value" 屬性中。 結果是一個可編輯的 HTML 表單,其中包含來自 XML 文件的值。

然後,我們有第二個樣式表:"tool_updated.xsl"。 這是將用於顯示更新的 XML 數據的 XSL 文件。 這個樣式表不會導致可編輯的 HTML 表單,而是靜態的 HTML 表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <h2>更新的工具信息:</h2>
  <table border="1">
    <xsl:for-each select="tool/field">
    <tr>
      <td><xsl:value-of select="@id" /></td>
      <td><xsl:value-of select="value" /></td>
    </tr>
    </xsl:for-each>
  </table>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>

在上面的 "tool.xsl" 文件中,將 HTML 表單的 action 屬性更改為 "edittool.php"。

"edittool.php" 頁麵包含兩個函數:loadFile() 函數載入和轉換 XML 文件以供顯示,updateFile() 函數將更改應用於 XML 文件:

<?php
function loadFile($xml, $xsl)
{
$xmlDoc = new DOMDocument();
$xml

Doc->load($xml);

$xslDoc = new DOMDocument();
$xslDoc->load($xsl);

$proc = new XSLTProcessor();
$proc->importStyleSheet($xslDoc);
echo $proc->transformToXML($xmlDoc);
}

function updateFile($xml)
{
$xmlLoad = simplexml_load_file($xml);
$postKeys = array_keys($_POST);

foreach($xmlLoad->children() as $x)
{
  foreach($_POST as $key=>$value)
  {
    if($key == $x->attributes())
    {
      $x->value = $value;
    }
  }
}

$xmlLoad->asXML($xml);
loadFile($xml,"tool_updated.xsl");
}

if($_POST["btn_sub"] == "")
{
  loadFile("tool.xml", "tool.xsl");
}
else
{
  updateFile("tool.xml");
}
?>

註意: 我們正在伺服器上進行轉換並將更改應用於 XML 文件。 這是一個跨瀏覽器解決方案。 客戶端將只從伺服器收到 HTML - 這將在任何瀏覽器中工作。

ASP 文件

在上面的 "tool.xsl" 文件中,HTML 表單的 action 屬性的值為 "edittool.asp"。

"edittool.asp" 頁麵包含兩個函數:loadFile() 函數載入和轉換 XML 文件以供顯示,updateFile() 函數將更改應用於 XML 文件:

<%
function loadFile(xmlfile,xslfile)
Dim xmlDoc,xslDoc
'Load XML and XSL file
set xmlDoc = Server.CreateObject("Microsoft.XMLDOM")
xmlDoc.async = false
xmlDoc.load(xmlfile)
set xslDoc = Server.CreateObject("Microsoft.XMLDOM")
xslDoc.async = false
xslDoc.load(xslfile)
'Transform file
Response.Write(xmlDoc.transformNode(xslDoc))
end function

function updateFile(xmlfile)
Dim xmlDoc,rootEl,f
Dim i
'Load XML file
set xmlDoc = Server.CreateObject("Microsoft.XMLDOM")
xmlDoc.async = false
xmlDoc.load(xmlfile)

'Set the rootEl variable equal to

 the root element
Set rootEl = xmlDoc.documentElement

'Loop through the form collection
for i = 1 To Request.Form.Count
  'Eliminate button elements in the form
  if instr(1,Request.Form.Key(i),"btn_")=0 then
    'The selectSingleNode method queries the XML file for a single node
    'that matches a query. This query requests the value element that is
    'the child of a field element that has an id attribute which matches
    'the current key value in the Form Collection. When there is a match -
    'set the text property equal to the value of the current field in the
    'Form Collection.
    set f = rootEl.selectSingleNode("field[@id='" & _
    Request.Form.Key(i) & "']/value")
    f.Text = Request.Form(i)
  end if
next

'Save the modified XML file
xmlDoc.save xmlfile

'Release all object references
set xmlDoc=nothing
set rootEl=nothing
set f=nothing

'Load the modified XML file with a style sheet that
'allows the client to see the edited information
loadFile xmlfile,server.MapPath("tool_updated.xsl")
end function

'If form is submitted, update the XML file and display result
' - if not, transform the XML file for editing
if Request.Form("btn_sub")="" then
  loadFile server.MapPath("tool.xml"),server.MapPath("tool.xsl")
else
  updateFile server.MapPath("tool.xml")
end if
%>

最後

為了方便其他設備和平臺的小伙伴觀看往期文章:

微信公眾號搜索:Let us Coding,關註後即可獲取最新文章推送

看完如果覺得有幫助,歡迎點贊、收藏、關註


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

-Advertisement-
Play Games
更多相關文章
  • setreuid(-1,foo) 為何有時更新 saved set-user-id 有時不更新?man setreuid 中關於 SUID 變更的說明是否正確?如此設計有何考慮?本文通過閱讀 linux 源碼為你揭秘 ...
  • 痞子衡嵌入式半月刊: 第 97 期 這裡分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農曆年分二十四節氣,希望在每個交節之日準時發佈一期。 本期刊是開源項目(GitHub: JayHeng/pzh-mcu-bi-weekly),歡迎提交 issue,投稿或推薦你知道的嵌入式那些事兒。 上期回顧 ...
  • @目錄前言簡介一、準備工作1.1 創建寫入腳本1.2 設置執行許可權1.3 添加定時任務1.4 配置生效二、Tomcat日誌 按每天分割2.1 創建一個 sh文件2.2 設置執行許可權2.3 設置crontab指令,指定每日定時任務2.4 配置生效總結 前言 請各大網友尊重本人原創知識分享,謹記本人博客 ...
  • Android Compose 入門,深入底層源碼分析 我是跟著AS官網學習的,但是官方的教程寫的不是很詳細.官網鏈接 首先創建一個Compose項目,目錄結構是這樣: ui -> theme -> -> Color.kt -> -> Theme.kt -> -> Type.kt MainActiv ...
  • 一、Popup Popup組件通常用於在屏幕上彈出一個對話框或者浮動視窗。這個組件通常和其他組件一起用於用戶界面的交互和反饋。 Popup組件可以包含任何類型的組件或內容,比如文本、按鈕、輸入框、圖片等等。在打開和關閉Popup時,可以在代碼中設置不同的動畫效果來增強用戶體驗。 Popup組件的 ...
  • 一、Video 視頻組件是用於應用程式中嵌入視頻的一種方法。它可以讓用戶在網站上觀看視頻並與其進行交互。通常,視頻組件將一個視頻文件嵌入應用程式中,並提供一組控制項,這些控制項允許用戶播放、暫停、跳過、音量調整和全屏等。通過使用視頻組件,開發者可以更容易地將視頻嵌入應用程式,使其更易於管理和控制。 ...
  • 在我之前的文章中講了vue文件是如何編譯成js文件,今天這篇文章接著來講講vue3中是如何將template模塊編譯為render函數的。 ...
  • 本文分享自華為雲社區《3月閱讀周·你不知道的JavaScript | ES6生成器,看似同步的非同步流程式控制製表達風格》,作者: 葉一一。 生成器 打破完整運行 JavaScript開發者在代碼中幾乎普遍依賴的一個假定:一個函數一旦開始執行,就會運行到結束,期間不會有其他代碼能夠打斷它並插入其間。 ES ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...