2012-08-11 34 views
1

我有一个查询:如何更改的XML模式的格式从SQL服务器获取

SELECT top 0 * FROM sometable FOR XML AUTO, ELEMENTS, XMLSCHEMA ('MyURI') 

该查询返回的模式:

<xsd:element name="ClientName"> 
    <xsd:simpleType> 
    <xsd:restriction base="sqltypes:nvarchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52"> 
     <xsd:maxLength value="50" /> 
    </xsd:restriction> 
    </xsd:simpleType> 
</xsd:element> 

但我想更多的东西是这样的:

<xsd:element name="ClientName"> 
    <xsd:simpleType> 
    <xsd:restriction base="xsd:string"> 
    <xsd:maxLength value="50" /> 
    </xsd:restriction> 
    </xsd:simpleType> 
</xsd:element> 

我该如何做到这一点?

回答

0

您可以使用XSL转换将SQL Server类型更改回所需的XSD类型。

如何应用转换取决于您的应用程序。如果您为表格创建静态模式,那么您可以使用类似Visual Studio或msxsl的东西。如果这是来自服务器的常规请求,那么Applying an XSL Transformation (SQLXML Managed Classes)可能更适合。

你可以建立与其他类型的样式表是:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" 
    xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes" 
    xmlns="http://www.w3.org/1999/XSL/Transform" 
    > 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:param name="Strip">false</xsl:param> 
    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="@base"> 
    <xsl:attribute name="{name()}"> 
     <xsl:choose> 
     <xsl:when test=".='sqltypes:nvarchar'">xsd:string</xsl:when> 
     <!-- Add additional tests here --> 
     <xsl:otherwise> 
      <xsl:value-of select="."/> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:attribute> 
    </xsl:template> 

    <xsl:template match="@sqltypes:*"> 
    <xsl:if test="$Strip=true"> 
     <xsl:comment> 
     <xsl:text>Stripped (</xsl:text> 
     <xsl:value-of select="concat(name(), '=&quot;', ., '&quot;')"/> 
     <xsl:text>)</xsl:text> 
     </xsl:comment> 
    </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

变化在开始的时候,如果你需要看到的是在变换过程中剥离的属性假地带参数。

相关问题