使用 XML 模板
下面是模板的一般形式,顯示了指定 SQL 查詢和 XPath 查詢的方式:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"
sql:xsl='XSL FileName' >
<sql:header>
<sql:param>..</sql:param>
<sql:param>..</sql:param>...n
</sql:header>
<sql:query>
sql statement(s)
</sql:query>
<sql:xpath-query mapping-schema="SchemaFileName.xml">
XPath query
</sql:xpath-query>
</ROOT>
模板中的任何元素都是可選的。元素 <header>、<param>、<query>、<XPath-query> 和特性映射架構在 sql 命名空間中定義。因此,必須在命名空間中聲明 xmlns:sql="urn:schemas-microsoft-com:xml-sql"。可對命名空間任意命名;sql 只是一個別名。
<ROOT>
指定此標記以提供所得到的 XML 文檔的單個頂層元素(也稱為根標記)。<ROOT> 標記可以是任何名稱。
<sql:header>
此標記用於儲存所有標題值。在目前的實施方案中,只能在此標記中指定 <sql:param> 元素。<sql:header> 用作包含標記,使您得以定義多個參數。所有的參數定義都在一個位置中,這使得處理參數定義更有效。
<sql:param>
該元素用於定義在模板內傳遞到查詢的參數。每個 <param> 元素定義一個參數。可以在 <sql:header> 標記中定義多個 <param> 元素。
<sql:query>
該元素用於指定 SQL 查詢。可以在模板中指定多個 <sql:query> 元素。
<sql:xpath-query>
該元素用於指定 XPath 查詢。因為 XPath 查詢是在帶批註的 XML 資料簡化 (XDR) 架構上執行,所以必須使用 mapping-schema 特性指定架構檔案名稱。
sql:xsl
該特性用於指定將應用於所得到的 XML 文檔的可延伸樣式表語言 (XSL) (XSL) 樣式表。在指定映射架構檔案時,可以指定相對或絕對路徑。指定的相對路徑是相對於與 template 類型的虛擬名稱關聯的目錄。例如,如果與 template 類型的虛擬名稱相關聯的目錄是 C:/Template,那麼為 sql:xsl 指定的相對路徑 Xyz/MyXSL.xml 將映射到 C:/Template/Xyz/MyXSL.xml。
mapping-schema
該特性用於標識帶批註的 XDR 架構。僅當在模板中執行 XPath 查詢時才指定該特性。XPath 查詢在帶批註的 XDR 架構上執行。在指定映射架構檔案時,可以指定相對或絕對路徑。指定的相對路徑是相對於與 template 類型的虛擬名稱關聯的目錄。例如,如果與 template 類型的虛擬名稱關聯的目錄是 C:/Template,則相對路徑(為 mapping-schema 指定的 schema/MSchema.xml)映射到 C:/Template/Schema/MSchema.xml。
說明 每個 <sql:query> 或 <sql:XPath-query> 表示單獨的事務。因此,如果在模板中有多個 <sql:query> 或 <sql:XPath-query> 標記,當一個標記失敗時,其它標記將繼續。
如果設定了 contenttype,則 Sqlisapi.dll 將標題資訊返回給瀏覽器。如果沒有設定 contenttype,則 urlmon 使用模板檔案中的第一個字元確定內容類型。如果模板中的第一個字元是 < 字元或 Unicode 位元組順序標誌 (0xFFFE),則將 text/xml 作為內容類型返回給瀏覽器,且瀏覽器顯示結果。否則,Sqlisapi.dll 不發送用以指導瀏覽器如何顯示結果的內容類型標題資訊;因此,在瀏覽器中將看不到結果。
可以在 URL 範本中指定模板之前,必須使用用於 SQL Server 的 IIS 虛擬目錄管理工具 + 生產力建立 template 類型的虛擬名稱。有關更多資訊,請參見使用用於 SQL Server 的 IIS 虛擬目錄管理工具 + 生產力。
儲存模板
模板儲存在與 template 類型的虛擬名稱關聯的目錄或它的一個子目錄中:
如果模板儲存在與 template 類型的虛擬名稱關聯的目錄中,則 URL 查詢的形式如下:
http://IISServer/nwind/TemplateVirtualName/TemplateFile.xml
如果模板儲存在與 template 類型 (xyz) 的虛擬名稱關聯的子目錄中,則 URL 查詢的形式如下:
http://IISServer/nwind/TemplateVirtualName/xyz/TemplateFile.xml在模板中指定 XSL 樣式表可以對查詢結果應用可延伸樣式表語言 (XSL) (XSL) 樣式表。當使用 HTTP 執行模板時,可以用下列方法指定 XSL 檔案: 在模板中使用 sql:xsl 特性。使用 xsl 關鍵字作為 URL 的一部分,以指定將用於處理所得到的 XML 資料的 XSL 檔案。 如果在模板中使用 sql:xsl 指定 XSL 檔案並且在 URL 中使用關鍵字 xsl 指定 XSL 檔案,則先對結果應用在模板中指定的 XSL 樣式表,然後應用在 URL 中指定的 XSL 檔案。樣本在下列樣本中,nwind 是使用用於 SQL Server 的 IIS 虛擬目錄管理工具 + 生產力建立的虛擬目錄,template 是建立虛擬目錄時定義的 template 類型的虛擬名稱(建立虛擬目錄時可以為其指定任何虛擬名稱)。有關更多資訊,請參見使用用於 SQL Server 的 IIS 虛擬目錄管理工具 + 生產力。A. 在模板中指定 sql:xsl 以處理結果在下例中,模板包含簡單的 SELECT 語句。按照使用 sql:xsl 指定的 XSL 檔案中的說明處理查詢結果。<?xml version ='1.0' encoding='UTF-8'?>
<root xmlns:sql='urn:schemas-microsoft-com:xml-sql'
sql:xsl='MyXSL.xsl'>
<sql:query>
SELECT FirstName, LastName FROM Employees FOR XML AUTO
</sql:query>
</root>
為舉例說明,將模板 (TemplateWithXSL.xml) 儲存在與 template 類型的虛擬名稱 (template) 關聯的目錄中。XSL 檔案 (MyXSL.xsl) 也儲存在同一目錄中。下面是 XSL 檔案:<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match = 'Employees'>
<TR>
<TD><xsl:value-of select = '@FirstName' /></TD>
<TD><B><xsl:value-of select = '@LastName' /></B></TD>
</TR>
</xsl:template>
<xsl:template match = '/'>
<HTML>
<HEAD>
<STYLE>th { background-color: #CCCCCC }</STYLE>
</HEAD>
<BODY>
<TABLE border='1' style='width:300;'>
<TR><TH colspan='2'>Employees</TH></TR>
<TR><TH >First name</TH><TH>Last name</TH></TR>
<xsl:apply-templates select = 'root' />
</TABLE>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
下面的 URL 執行模板:http://IISServer/nwind/template/TemplateWithXSL.xml?contenttype=text/html結果以兩列表的格式(FirstName 和 LastName)顯示。還可在 URL 中指定 XSL 檔案,而不是在模板中(使用 sql:xsl)指定該檔案。在這種情況下,XSL 檔案必須儲存在與虛擬根 (nwind) 或其子目錄關聯的目錄中,此時必須在 URL 中指定相對路徑。假設 XSL 檔案儲存體在與 nwind 虛擬目錄關聯的目錄中,則下面的 URL 執行模板:http://IISServer/nwind/template/templateFile.xml?xsl=MyXSL.xsl
如果 XSL 檔案儲存體在虛擬根目錄的一個子目錄 (x) 中,則下面的 URL 這樣指定相對路徑:http://IISServer/nwind/template/templateFile.xml?xsl=/x/MyXSL.xsl
如果在模板中使用 sql:xsl 並且在 URL 中使用關鍵字 xsl 指定 XSL 檔案,則在模板中指定的 XSL 樣式表首先應用於結果,然後應用在 URL 中指定的 XSL 檔案。
樣本 XPath 查詢
本樣本 XPath 查詢引用下面兩個映射架構。映射架構是帶批註的簡化 XML-Data (XDR) 架構。有關映射架構的更多資訊,請參見使用帶批註的 XDR 架構建立 XML 視圖。
說明 在可以使用 URL 執行樣本 XPath 查詢前,必須建立虛擬根以訪問 Northwind 資料庫和 template 及 schema 類型的虛擬名稱。有關建立樣本 nwind 虛擬目錄和虛擬名稱的資訊,請參見建立 nwind 虛擬目錄。有關使用 HTTP 訪問 Microsoft SQL Server 的更多資訊,請參見使用 HTTP 訪問 SQL Server。
有兩種方法可對帶批註的 XDR 架構執行 XPath 查詢:
建立一個模板,在其中包含一個 XPath 查詢。然後在 URL(例如 http://IISServer/VirtualRoot/TemplateVirtualName/TemplateFile.xml)中執行該模板。在該模板中,指定將對其執行 XPath 查詢的映射架構。在這種情況下,必須將映射架構儲存到與 template 類型的虛擬名稱相關聯的目錄(或它的一個子目錄,此時將某相對路徑指定為模板內 mapping-schema 特性的值)下。
可直接在 URL(例如 http://IISServer/VirtualRoot/SchemaVirtualName/SchemaFile.xml/XpathQuery)中指定 XPath 查詢。在這種情況下,必須將架構檔案儲存體到與 schema 類型的虛擬名稱相關聯的目錄下。
樣本帶批註的 XDR 架構
在本節的所有樣本中,為了說明,將在模板中指定 XPath 查詢,並使用 HTTP 執行該模板。因此,必須使用此映射架構檔案 (SampleSchema1.xml),它儲存在與 template 類型虛擬名稱相關聯的目錄下:
<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ElementType name="Customer" sql:relation="Customers">
<AttributeType name="CustomerID" dt:type="id" />
<AttributeType name="CompanyName" />
<AttributeType name="ContactName" />
<AttributeType name="City" />
<AttributeType name="Fax" />
<AttributeType name="Orders" dt:type="idrefs" sql:id-prefix="Ord-" />
<attribute type="CustomerID" />
<attribute type="CompanyName" />
<attribute type="ContactName" />
<attribute type="City" />
<attribute type="Fax" />
<attribute type="Orders" sql:relation="Orders" sql:field="OrderID">
<sql:relationship
key-relation="Customers"
key="CustomerID"
foreign-relation="Orders"
foreign-key="CustomerID" />
</attribute>
<element type="Order">
<sql:relationship
key-relation="Customers"
key="CustomerID"
foreign-relation="Orders"
foreign-key="CustomerID" />
</element>
</ElementType>
<ElementType name="Order" sql:relation="Orders">
<AttributeType name="OrderID" dt:type="id" sql:id-prefix="Ord-" />
<AttributeType name="EmployeeID" />
<AttributeType name="OrderDate" />
<AttributeType name="RequiredDate" />
<AttributeType name="ShippedDate" />
<attribute type="OrderID" />
<attribute type="EmployeeID" />
<attribute type="OrderDate" />
<attribute type="RequiredDate" />
<attribute type="ShippedDate" />
<element type="OrderDetail">
<sql:relationship
key-relation="Orders"
key="OrderID"
foreign-relation="[Order Details]"
foreign-key="OrderID" />
</element>
</ElementType>
<ElementType name="OrderDetail" sql:relation="[Order Details]"
sql:key-fields="OrderID ProductID">
<AttributeType name="ProductID" dt:type="idref"
sql:id-prefix="Prod-" />
<AttributeType name="UnitPrice"/>
<AttributeType name="Quantity" />
<attribute type="ProductID" />
<attribute type="UnitPrice" sql:field="UnitPrice" />
<attribute type="Quantity" />
<element type="Discount" sql:field="Discount"/>
</ElementType>
<ElementType name="Discount" dt:type="string"
sql:relation="[Order Details]"/>
<ElementType name="Employee" sql:relation="Employees">
<AttributeType name="EmployeeID" />
<AttributeType name="LastName" />
<AttributeType name="FirstName" />
<AttributeType name="Title" />
<attribute type="EmployeeID" />
<attribute type="LastName" />
<attribute type="FirstName" />
<attribute type="Title" />
</ElementType>
</Schema>
說明
按查詢所執行的 XPath 操作類型將樣本查詢分組。