首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# XPath 與 XSLT 開發實戰:XML 轉換、查詢與雙端渲染架構

     編輯:關於C#

前言:XML 技術棧的兩大支柱

XPath(定址)與 XSLT(轉換)是 XML 技術體系的核心標準,均由 W3C 制定,跨平台、跨語言。本講系統介紹兩者概念,並透過 C# 實戰演示:伺服器端/用戶端雙模式 XSLT 渲染、XPath 查詢引擎、ASP.NET 整合模式。

XPath:XML 文檔的 GPS 導航系統

核心概念

  • 文件路徑類比:C:\Users\Name\Doc → XML 路徑 /Table/Record/Country
  • 分隔符:/(層級)、//(任意深度後代)
  • 相對/絕對路徑、.(當前節點)、..(父節點)
  • 謂詞過濾:[Condition] 解決同名節點多重匹配問題
    例:/Table/Record[CustomerID='ANATR']/Phone
  • 支援運算:字串比較、數學四則、邏輯 and/or/not、內建函數(position()、count()、concat()、substring-after()…)

.NET 中的 XPath 執行

XmlDocument doc = new XmlDocument(); doc.LoadXml(xmlString);
// 選取節點集
XmlNodeList nodes = doc.SelectNodes("/Table/Record[Country='USA']");
// 選取單一節點
XmlNode node = doc.SelectSingleNode("//Field[@PrimaryKey='true']");
// 遍歷輸出
foreach (XmlNode n in nodes) Console.WriteLine(n.OuterXml);
  • XmlNode.SelectNodes/SingleNode 為核心 API,參數為 XPath 字串
  • 命名空間查詢需使用 XmlNamespaceManager 註冊前綴
  • .NET 擴展支援自訂函數(XsltContext),標準 XPath 函數全支援

XSLT:XML 到任意文本的圖靈完備轉換語言

處理模型:三文檔交互

  1. 來源 XML:資料載體
  2. XSLT 樣式表:轉換邏輯(本身為 XML,使用 xsl: 命名空間)
  3. 輸出文本:XML、HTML、SQL、程式碼…任意格式,純文本

XSLT 執行語義:前序遍歷 + 模板匹配

概念上等同:

void Transform(XmlNode node) {
    foreach (Template t in templates) if (t.Match(node)) { t.Apply(node); return; }
    // 內建預設:文字節點輸出文本,元素節點遞迴處理子節點
}

關鍵元素:

  • xsl:template match="XPath":匹配規則(類似函數簽名)
  • xsl:template name="foo":命名模板(類似具名函數,xsl:call-template 調用)
  • xsl:for-each select="XPath":迴圈遍歷節點集
  • xsl:value-of select="XPath":輸出節點文本值
  • xsl:if/xsl:choose/when/otherwise:條件分支
  • xsl:variable:單次賦值常數
  • xsl:attribute、xsl:element:動態生成輸出屬性/元素
  • xsl:sort、xsl:output:排序與輸出格式控制

範例:XML → HTML 表格

<xsl:stylesheet version="1.0" xmlns:xsl="https://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html"/>
  <xsl:template match="/">
    <html><body><table border="1">
      <xsl:for-each select="Table/Record">
        <tr>
          <xsl:for-each select="*">  <!-- 所有子元素 -->
            <td><xsl:value-of select="."/></td>
          </xsl:for-each>
        </tr>
      </xsl:for-each>
    </table></body></html>
  </xsl:template>
</xsl:stylesheet>

對應 C# 模擬碼(展示邏輯等價性):

StringWriter sw = new StringWriter();
sw.WriteLine("");
foreach (XmlNode rec in doc.SelectNodes("Table/Record")) {
    sw.WriteLine("");
    foreach (XmlNode field in rec.SelectNodes("*")) {
        sw.Write("");
    }
    sw.WriteLine("");
}
sw.WriteLine("
"); sw.Write(field.InnerText); sw.WriteLine("
");

ASP.NET 雙模式 XSLT 渲染架構

模式一:伺服器端轉換 record.aspx

// Page_Load
XmlDocument doc = BuildXmlFromDatabase(); // 查詢 DB 建構 XML
string xsltRef = Request.QueryString["xsl"];
if (!string.IsNullOrEmpty(xsltRef)) {
    XslTransform xslt = new XslTransform();
    xslt.Load(Server.MapPath(xsltRef));
    xslt.Transform(doc, null, Response.Output, null); // 直接輸出到 HTTP 回應流
    return;
}
// 無 XSLT 參數則直接輸出 XML
Response.ContentType = "text/xml";
doc.Save(Response.Output);
  • 優點:相容所有瀏覽器、伺服器端可控、支援複雜邏輯擴展
  • 缺點:伺服器 CPU 壓力、頻寬較大(輸出完整 HTML)

模式二:用戶端轉換 recordxml.aspx

// Page_Load
Response.ContentType = "text/xml";
XmlTextWriter xw = new XmlTextWriter(Response.Output) { Formatting = Formatting.Indented };
// ... 輸出 XML 資料 ...
// 關鍵:輸出 xml-stylesheet 處理指令
string xsltRef = Request.QueryString["xsl"];
if (!string.IsNullOrEmpty(xsltRef)) {
    xw.WriteProcessingInstruction("xml-stylesheet",
        "type='text/xsl' href='" + xsltRef + "'");
}
xw.Close();
  • 瀏覽器解析 XML,讀取 xml-stylesheet 指令,下載 XSLT,本地轉換渲染
  • 優點:頻寬極省(僅傳 XML + 小型 XSLT)、卸載伺服器 CPU、利用用戶端閒置算力
  • 缺點:需瀏覽器支援 XSLT(IE/Edge/Chrome/Firefox 均支援)、除錯較難、無法存取伺服器資源
  • 關鍵:xml-stylesheet 僅對瀏覽器生效,伺服器端 XslTransform 會忽略它

架構對比總結

維度伺服器端 XSLT用戶端 XSLT
傳輸資料量大 (完整 HTML)小 (XML + XSLT)
伺服器 CPU高低 (僅序列化 XML)
用戶端 CPU低中 (執行轉換)
相容性全瀏覽器需 XSLT 支援
除錯便利性高 (伺服器端斷點)低 (瀏覽器開發者工具)
適用場景複雜報表、PDF 生成、SEO 頁面資料密集型列表、離線應用、行動裝置

XPath 查詢測試頁:recordxpath.aspx

  • 介面:文字框輸入 XPath → 按鈕執行 → 多行文字框顯示結果
  • 核心邏輯:doc.SelectNodes(userXPath) → 遍歷 XmlNodeList → GetXMLString(node) 輸出帶縮排 XML
  • GetXMLString 使用 XmlSerializer 或 XmlTextWriter 產生美觀輸出,替代 OuterXml(無縮排)

XML/XSLT 在 Web 開發中的戰略價值

  • 關注點分離:業務邏輯產 XML,呈現邏輯在 XSLT,代碼結構清晰
  • 多通道復用:同一 XML 可輸出 HTML、JSON、CSV、PDF、程式碼…
  • Web Service 基石:SOAP/REST 皆建於 XML 序列化之上
  • AJAX 前身:早期 AJAX 即用 XMLHttpRequest 取 XML + XSLT 渲染
  • 客戶端渲染先驅:預示現代 SPA(React/Vue)的「資料與視圖分離」思想

推廣阻力:XSLT 模板編寫成本高(需同時精通輸入 XML、輸出目標、XSLT 語法)、工具鏈相對薄弱、現有 Web 控件生態未為 XSLT 設計。建議:探索「HTML → XSLT」自動化轉換工具,降低門檻。

本講小結

本講建立了 XPath/XSLT 的完整認知框架與 C# 實戰技能:

  • XPath:精準定址 XML 節點,支援豐富謂詞與函數
  • XSLT:模板匹配驅動的文檔轉換語言,圖靈完備
  • 雙端渲染架構:伺服器端 XslTransform.Transform vs 用戶端 xml-stylesheet
  • ASP.NET 整合:XmlDocument/XmlTextWriter 產 XML,XslTransform 執行轉換

XML 及其衍生技術是現代軟體互操作的通用語言,深度掌握將顯著提升架構設計與跨平台整合能力。下一階段我們將轉向 C# 圖形開發,探索完全不同的視覺計算世界。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved