应用 XSLT 转换(SQLXMLOLEDB 提供者)

在此示例 ADO 应用程序中,执行 SQL 查询,并将 XSL 转换应用于结果。 将 ClientSideXML 属性设置为 True 会强制处理客户端上的行集。 命令方言设置为 {5d531cb2-e6ed-11d2-b252-00c04f681b71},因为在模板中指定 SQL 查询,并且在执行模板时必须指定此方言。 xsl 属性指定要用于应用转换的 XSL 文件。 Base Path 属性的值用于搜索 XSL 文件。 如果在 xsl 属性的值中指定路径,则路径相对于在 Base Path 属性中指定的路径。

此示例演示如何使用以下 SQLXMLOLEDB 提供程序特定的属性:

  • ClientSideXML

  • xsl

在此客户端 ADO 示例应用程序中,将在服务器上执行包含 SQL 查询的 XML 模板。

由于 ClientSideXML 属性设置为 True,因此不带 FOR XML 子句的 SELECT 语句将发送到服务器。 服务器执行查询并将行集返回到客户端。 然后,客户端将 FOR XML 转换应用于行集并生成 XML 文档。

xsl 属性是在应用程序中指定的;因此,XSL 转换应用于在客户端上生成的 XML 文档,结果为两列表。

若要执行模板命令,必须指定 XML 模板方言 - {5d531cb2-e6ed-11d2-b252-00c04f681b71} - 必须指定。

注释

在代码中,必须在连接字符串中提供 Microsoft SQL Server 实例的名称。 此外,此示例还指定对需要安装其他网络客户端软件的数据提供程序使用 SQL Server Native Client。 有关详细信息,请参阅 SQL Server Native Client 的系统要求

Option Explicit  
Sub main()  
Dim oTestStream As New ADODB.Stream  
Dim oTestConnection As New ADODB.Connection  
Dim oTestCommand As New ADODB.Command  
oTestConnection.Open "provider=SQLXMLOLEDB.4.0;data provider=SQLNCLI11;data source=SqlServerName;initial catalog=AdventureWorks;Integrated Security=SSPI;"  
Set oTestCommand.ActiveConnection = oTestConnection  
oTestCommand.Properties("ClientSideXML") = True  
oTestCommand.CommandText = _  
        "<ROOT xmlns:sql='urn:schemas-microsoft-com:xml-sql' >" & _  
       " <sql:query> " & _  
        "   SELECT TOP 25 FirstName, LastName FROM Person.Contact FOR XML AUTO " & _  
        "   </sql:query> " & _  
        " </ROOT> "  
oTestStream.Open  
' You need the dialect if you are executing a template.  
oTestCommand.Dialect = "{5d531cb2-e6ed-11d2-b252-00c04f681b71}"  
oTestCommand.Properties("Output Stream").Value = oTestStream  
oTestCommand.Properties("Base Path").Value = "c:\Schemas\SQLXML4\ExecuteTemplateWithXSL\"  
oTestCommand.Properties("xsl").Value = "myxsl.xsl"  
oTestCommand.Execute , , adExecuteStream  
  
oTestStream.Position = 0  
oTestStream.Charset = "utf-8"  
Debug.Print oTestStream.ReadText(adReadAll)  
End Sub  
Sub Form_Load()  
 main  
End Sub  

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 = 'Person.Contact'>  
       <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'>Contacts</TH></TR>  
           <TR>  
              <TH >First name</TH>  
              <TH>Last name</TH>  
           </TR>  
           <xsl:apply-templates select = 'ROOT' />  
         </TABLE>  
        </BODY>  
      </HTML>  
    </xsl:template>  
</xsl:stylesheet>