共用方式為


XslTransform 類別實作 XSLT 處理器

Note注意事項

XslTransform 類別在 Microsoft .NET Framework 2.0 版本 中已過時。您可以使用 XslCompiledTransform 類別來執行可延伸樣式表語言轉換 (XSLT)。如需詳細資訊,請參閱使用 XslCompiledTransform 類別從 XslTransform 類別轉換

XslTransform 類別是可實作 XSL 轉換 (XSLT) 1.0 版建議事項的 XSLT 處理器。Load 方法可尋找及讀取樣式表,而 Transform 方法可轉換指定的來源文件。任何實作 IXPathNavigable 介面的存放區都可用來做為 XslTransform 的來源文件。.NET Framework 目前可實作 XmlDocumentXmlDataDocumentXPathDocument 上的 IXPathNavigable 介面,因此它們都可用來做為轉換的輸入來源文件。

.NET Framework 中的 XslTransform 物件僅支援 XSLT 1.0 規格,此規格是以下列命名空間定義:

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

可使用 Load 方法,從下列其中一個類別載入樣式表:

  • XPathNavigator

  • XmlReader

  • 表示 URL 的字串

上述每個輸入類別都有不同的 Load 方法。有些方法會採用上述其中一個類別與 XmlResolver 類別的組合,來做為引數。XmlResolver 會尋找樣式表中之 <xsl:import><xsl:include> 所參考的資源。下列幾種方法會採用字串 (XmlReader) 或 XPathNavigator 做為輸入。

Overloads Public Sub Load(String)
public void Load(string);
Overloads Public Sub Load(String, XmlResolver)
public void Load(string, XmlResolver);
Overloads Public Sub Load(XmlReader, XmlResolver, Evidence)
public void Load(XmlReader, XmlResolver, Evidence);
Overloads Public Sub Load(XPathNavigator, XmlResolver, Evidence)
public void Load(XPathNavigator, XmlResolver, Evidence);

上述 Load 方法大多會以 XmlResolver 做為參數。XmlResolver 可用來載入樣式表,以及 xsl:import 和 xsl:include 項目中所參考的任何樣式表。

Load 方法也大多會以辨識項做為參數。辨識項參數是與樣式表關聯的 Evidence。樣式表的安全性層級會影響它所參考之後續資源的安全性層級,例如它所包含的指令碼、所使用的任何 document() 函式,以及 XsltArgumentList 所使用的任何擴充物件。

如果使用 Load 方法 (具有 URL 參數但未提供辨識項) 來載入樣式表,則會結合指定的 URL 與其網站和區域來計算樣式表的辨識項。

若未提供 URI 或辨識項,則樣式表的辨識項集合將完全受信任。請勿從未受信任的來源載入樣式表,或者將未受信任的擴充物件加入 XsltArgumentList 中。

如需安全性層級、辨識項,以及辨識項如何影響指令碼的詳細資訊,請參閱使用 <msxsl:script> 加入 XSLT 樣式表指令碼。如需安全性層級、辨識項,以及辨識項如何影響擴充物件的詳細資訊,請參閱樣式表參數和擴充物件的 XsltArgumentList

如需安全性層級、辨識項,以及辨識項如何影響 document() 函式的詳細資訊,請參閱解析外部的 XSLT 樣式表和文件

可提供樣式表數個輸入參數。樣式表也可以呼叫擴充物件上的函式。參數和擴充物件都可透過 XsltArgumentList 類別提供給樣式表。如需 XsltArgumentList 的詳細資訊,請參閱 XsltArgumentList 成員

建議的 XslTransform 類別安全使用法

樣式表的安全性權限取決於所提供的辨識項。下表摘錄樣式表的位置,並針對應提供何種辨識項型別加以說明。

案例 要提供的辨識項型別

XSLT 樣式表沒有外部參考,或者樣式表來自您信任的程式碼基底。

從您的組件提供辨識項:

Dim xslt = New XslTransform()
xslt.Load(stylesheet, resolver, Me.GetType().Assembly.Evidence)
XsltTransform xslt = new XslTransform(); 
xslt.Load(stylesheet, resolver,
this.GetType().Assembly.Evidence);

XSLT 樣式表來自外部來源。已知來源的源頭而且有可驗證的 URI。

使用 URI 建立辨識項。

Dim xslt As New XslTransform()
Dim ev As Evidence = XmlSecureResolver.CreateEvidenceForUrl(stylesheetUri)
xslt.Load(stylesheet, resolver, evidence)
XslTransform xslt = new XslTransform();
Evidence ev = XmlSecureResolver.CreateEvidenceForUrl(stylesheetUri);
xslt.Load(stylesheet, resolver, evidence);

XSLT 樣式表來自外部來源。不知道來源的源頭。

將辨識項設為 null。不會處理指令碼區塊、不支援 XSLT document() 函式,且不允許授權的擴充物件。

此外,您也可以將 resolver 參數設為 null。如此可確保不會處理 xsl:importxsl:include 項目。

XSLT 樣式表來自外部來源。不知道來源的源頭,但是您需要指令碼支援。

自呼叫端要求識別項。

XML 資料的轉換

載入樣式表後,即可呼叫其中一個 Transform 方法以及提供輸入來源文件來啟動轉換。可多載化 Transform 方法,以提供不同的轉換輸出。轉換可以導致下列的輸出格式:

字串 URL 是最後一個格式,可用於 URL 中的輸入文件轉換作業,以及將文件寫入輸出 URL 的作業所常見的案例中。這項 Transform 是一項便利的方法,可從檔案載入 XML 文件,然後執行 XSLT 轉換,再將輸出寫入檔案中。可以防止您必須建立和載入輸入來源文件,再寫入至檔案資料流。下列程式碼範例將以字串 URL 做為輸入和輸出,以示範 Transform 方法的使用情形:

Dim xsltransform As XslTransform = New XslTransform()
xsltransform.Load("favorite.xsl")
xsltransform.Transform("MyDocument.Xml", "TransformResult.xml", Nothing)
XslTransform xsltransform = new XslTransform();
xsltransform.Load("favorite.xsl");
xsltransform.Transform("MyDocument.xml", "TransformResult.xml", null);

轉換 XML 文件的段落

轉換是套用到整個文件。換言之,如果您進入的節點不是文件的根節點,並不會阻止轉換程序取得載入文件的所有節點。若要轉換結果樹狀結構片段,則必須建立僅包含結果樹狀結構片段的 XmlDocument,並將 XmlDocument 傳遞給 Transform 方法中。以下範例將執行結果樹狀結構片段的轉換。

Dim xslt As New XslTransform()
xslt.Load("print_root.xsl")
Dim doc As New XmlDocument()
doc.Load("library.xml")
' Create a new document containing just the result tree fragment.
Dim testNode As XmlNode = doc.DocumentElement.FirstChild
Dim tmpDoc As New XmlDocument()
tmpDoc.LoadXml(testNode.OuterXml)
' Pass the document containing the result tree fragment 
' to the Transform method.
Console.WriteLine(("Passing " + tmpDoc.OuterXml + " to print_root.xsl"))
xslt.Transform(tmpDoc, Nothing, Console.Out, Nothing)
XslTransform xslt = new XslTransform();     
xslt.Load("print_root.xsl");
XmlDocument doc = new XmlDocument();
doc.Load("library.xml");
// Create a new document containing just the result tree fragment.
XmlNode testNode = doc.DocumentElement.FirstChild; 
XmlDocument tmpDoc = new XmlDocument(); 
tmpDoc.LoadXml(testNode.OuterXml);
// Pass the document containing the result tree fragment 
// to the Transform method.
Console.WriteLine("Passing " + tmpDoc.OuterXml + " to print_root.xsl");
xslt.Transform(tmpDoc, null, Console.Out, null);

此範例使用 library.xml 和 print_root.xsl 檔案做為輸入,並且會將下列項目輸出到主控台。

Passing <book genre="novel" ISBN="1-861001-57-5"><title>Pride And Prejudice</title></book> to print_root.xsl 
Root node is book.

library.xml

<library>
  <book genre='novel' ISBN='1-861001-57-5'>
     <title>Pride And Prejudice</title>
  </book>
  <book genre='novel' ISBN='1-81920-21-2'>
     <title>Hook</title>
  </book>
</library>

print_root.xsl

<stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform" >
  <output method="text" /> 
  <template match="/">
     Root node is  <value-of select="local-name(//*[position() = 1])" /> 
  </template>
</stylesheet>

XSLT 從 .NET Framework 1.0 版到 .NET Framework 1.1 版的轉換

下列表格將針對 Load 方法列出已過時的 .NET Framework 1.0 版方法以及新的 .NET Framework 1.1 版方法。新方法可讓您藉由指定辨識項來限制樣式表的使用權限。

.NET Framework 1.0 版過時的 Load 方法 .NET Framework 1.1 版替代的 Load 方法

Load(XPathNavigator input)、

Load(XPathNavigator input, XmlResolver resolver)

Load(XPathNavigator stylesheet, XmlResolver resolver, Evidence evidence)

Load(IXPathNavigable stylesheet)、

Load(IXPathNavigable stylesheet, XmlResolver resolver)

Load(IXPathNavigable stylesheet, XmlResolver resolver, Evidence evidence)

Load(XmlReader stylesheet)、

Load(XmlReader stylesheet, XmlResolver resolver)

Load(XmlReader stylesheet, XmlResolver resolver, Evidence evidence)

下列表格將針對 Transform 方法列出已過時的方法和新的方法。新方法採用的是 XmlResolver 物件。

.NET Framework 1.0 版過時的 Transform 方法 .NET Framework 1.1 版替代的 Transform 方法

XmlReader Transform(XPathNavigator input, XsltArgumentList args)

XmlReader Transform(XPathNavigator input, XsltArgumentList args, XmlResolver resolver)

XmlReader Transform(IXPathNavigable input, XsltArgumentList args)

XmlReader Transform(IXPathNavigable input, XsltArgumentList args, XmlResolver resolver)

Void Transform(XPathNavigator input, XsltArgumentList args, XmlWriter output)

Void Transform(XPathNavigator input, XsltArgumentList args, XmlWriter output, XmlResolver resolver)

Void Transform(IXPathNavigable input, XsltArgumentList args, XmlWriter output)

Void Transform(IXpathNavigable input, XsltArgumentList args, XmlWriter output, XmlResolver resolver)

Void Transform(XPathNavigator input, XsltArgumentList args, TextWriter output)

Void Transform(XPathNavigator input, XsltArgumentList args, TextWriter output, XmlResolver resolver)

Void Transform(IXPathNavigable input, XsltArgumentList args, TextWriter output)

Void Transform(IXPathNavigable input, XsltArgumentList args, TextWriter output, XmlResolver resolver)

Void Transform(XPathNavigator input, XsltArgumentList args, Stream output)

Void Transform(XPathNavigator input, XsltArgumentList args, Stream output, XmlResolver resolver)

Void Transform(IXPathNavigable input, XsltArgumentList args, Stream output)

Void Transform(IXPathNavigable input, XsltArgumentList args, Stream output, XmlResolver resolver)

Void Transform(String input, String output)

Void Transform(String input, String output, XmlResolver resolver)

System.Xml.Xsl.XslTransform.XmlResolver 屬性在 .NET Framework 1.1 版中已過時。請改用新的 Transform 多載,它採用的是 XmlResolver 物件。

請參閱

參考

XslTransform Class
XslTransform Members

概念

使用 XslTransform 類別進行 XSLT 轉換
轉換中的 XPathNavigator
轉換中的 XPathNodeIterator
XslTransform 的 XPathDocument 輸入
XslTransform 的 XmlDataDocument 輸入
XslTransform 的 XmlDocument 輸入