XPath(定址)與 XSLT(轉換)是 XML 技術體系的核心標準,均由 W3C 制定,跨平台、跨語言。本講系統介紹兩者概念,並透過 C# 實戰演示:伺服器端/用戶端雙模式 XSLT 渲染、XPath 查詢引擎、ASP.NET 整合模式。
C:\Users\Name\Doc → XML 路徑 /Table/Record/Country/(層級)、//(任意深度後代).(當前節點)、..(父節點)[Condition] 解決同名節點多重匹配問題/Table/Record[CustomerID='ANATR']/Phoneand/or/not、內建函數(position()、count()、concat()、substring-after()…)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 註冊前綴XsltContext),標準 XPath 函數全支援xsl: 命名空間)概念上等同:
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:排序與輸出格式控制<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.Write(field.InnerText); sw.WriteLine(" ");
}
sw.WriteLine(" ");
}
sw.WriteLine("
");
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);
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-stylesheet 指令,下載 XSLT,本地轉換渲染xml-stylesheet 僅對瀏覽器生效,伺服器端 XslTransform 會忽略它| 維度 | 伺服器端 XSLT | 用戶端 XSLT |
|---|---|---|
| 傳輸資料量 | 大 (完整 HTML) | 小 (XML + XSLT) |
| 伺服器 CPU | 高 | 低 (僅序列化 XML) |
| 用戶端 CPU | 低 | 中 (執行轉換) |
| 相容性 | 全瀏覽器 | 需 XSLT 支援 |
| 除錯便利性 | 高 (伺服器端斷點) | 低 (瀏覽器開發者工具) |
| 適用場景 | 複雜報表、PDF 生成、SEO 頁面 | 資料密集型列表、離線應用、行動裝置 |
recordxpath.aspxdoc.SelectNodes(userXPath) → 遍歷 XmlNodeList → GetXMLString(node) 輸出帶縮排 XMLGetXMLString 使用 XmlSerializer 或 XmlTextWriter 產生美觀輸出,替代 OuterXml(無縮排)XMLHttpRequest 取 XML + XSLT 渲染推廣阻力:XSLT 模板編寫成本高(需同時精通輸入 XML、輸出目標、XSLT 語法)、工具鏈相對薄弱、現有 Web 控件生態未為 XSLT 設計。建議:探索「HTML → XSLT」自動化轉換工具,降低門檻。
本講建立了 XPath/XSLT 的完整認知框架與 C# 實戰技能:
XslTransform.Transform vs 用戶端 xml-stylesheetXmlDocument/XmlTextWriter 產 XML,XslTransform 執行轉換XML 及其衍生技術是現代軟體互操作的通用語言,深度掌握將顯著提升架構設計與跨平台整合能力。下一階段我們將轉向 C# 圖形開發,探索完全不同的視覺計算世界。