學習 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
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...