Sdílet prostřednictvím


Zadejte cílový jmenný prostor pomocí atributu targetNamespace (SQLXML 4.0)

platí pro:SQL Serverazure SQL Database

Při psaní XSD schémat můžete použít atribut XSD targetNamespace k určení cílového jmenného prostoru. Tento článek popisuje, jak fungují XSD targetNamespace, elementFormDefault, a attributeFormDefault atributy, jak ovlivňují generovanou XML instanci a jak jsou dotazy XPath specifikovány pomocí jmenných prostorů.

Atribut můžete použít xsd:targetNamespace k umístění prvků a atributů z výchozího jmenného prostoru do jiného jmenného prostoru. Můžete také určit, zda by místně deklarované prvky a atributy schématu měly vypadat kvalifikované jmenným prostorem, buď explicitně použitím prefixu, nebo implicitně ve výchozím nastavení. Můžete použít atributy elementFormDefault a attributeFormDefault na prvku <xsd:schema> k globálnímu určení kvalifikace lokálních prvků a atributů, nebo můžete použít form atribut k určení jednotlivých prvků a atributů samostatně.

Examples

Pro vytvoření pracovních vzorků podle následujících příkladů musíte splnit určité požadavky. Pro více informací viz Požadavky na spouštění SQLXML Examples.

A. Specifikujte cílový jmenný prostor

Následující schéma XSD specifikuje cílový jmenný prostor pomocí atributu xsd:targetNamespace . Schéma také nastavuje hodnoty atributu elementFormDefault a attributeFormDefault na "unqualified" (výchozí hodnotu těchto atributů). Jedná se o globální deklaraci a ovlivňuje všechny lokální prvky (<Order> ve schématu ) a atributy (CustomerID, ContactName, a OrderID ve schématu).

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:sql="urn:schemas-microsoft-com:mapping-schema"
    xmlns:CO="urn:MyNamespace"
    targetNamespace="urn:MyNamespace">
    <xsd:annotation>
        <xsd:appinfo>
            <sql:relationship name="CustOrders"
                parent="Sales.Customer"
                parent-key="CustomerID"
                child="Sales.SalesOrderHeader"
                child-key="CustomerID" />
        </xsd:appinfo>
    </xsd:annotation>

    <xsd:element name="Customer"
        sql:relation="Sales.Customer"
        type="CO:CustomerType" />

    <xsd:complexType name="CustomerType">
        <xsd:sequence>
            <xsd:element name="Order"
                sql:relation="Sales.SalesOrderHeader"
                sql:relationship="CustOrders"
                type="CO:OrderType" />
        </xsd:sequence>
        <xsd:attribute name="CustomerID" type="xsd:string" />
        <xsd:attribute name="SalesPersonID" type="xsd:string" />
    </xsd:complexType>
    <xsd:complexType name="OrderType">
        <xsd:attribute name="SalesOrderID" type="xsd:integer" />
        <xsd:attribute name="CustomerID" type="xsd:string" />
    </xsd:complexType>
</xsd:schema>

V schématu:

  • Deklarace CustomerType typu and OrderType jsou globální a proto jsou zahrnuty v cílovém jmenném prostoru schématu. Výsledkem je, že když jsou tyto typy odkazovány v deklaraci prvku <Customer> a jeho <Order> potomka, je určena předpona přiřazená k cílovému jmennému prostoru.

  • Tento <Customer> prvek je také zahrnut do cílového jmenného prostoru schématu, protože je globálním prvkem ve schématu.

Proveďte následující dotaz XPath proti schématu:

(/CO:Customer[@CustomerID=1)

Dotaz XPath generuje tento instancový dokument (zobrazeno je pouze několik příkazů):

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <y0:Customer xmlns:y0="urn:MyNamespace"
      CustomerID="ALFKI" ContactName="Maria Anders">
        <Order CustomerID="ALFKI" OrderID="10643" />
        <Order CustomerID="ALFKI" OrderID="10692" />
        ...
  </y0:Customer>
  </ROOT>

Tento instancní dokument definuje jmenný prostor urn:MyNamespace a přiřazuje mu prefix (y0). Prefix se aplikuje pouze na globální <Customer> prvek. (Prvek je globální, protože je deklarován jako potomek prvku <xsd:schema> ve schématu.)

Prefix se neaplikuje na lokální prvky a atributy, protože hodnota elementFormDefault a attributeFormDefault atributy jsou ve schématu nastaveny na ."unqualified" Prvek <Order> je lokální, protože jeho deklarace se objevuje jako dítě prvku <complexType> , který prvek <CustomerType> definuje. Podobně jsou atributy (CustomerID, OrderID, a ContactName) lokální, nikoli globální.

Vytvořte pracovní vzorek tohoto schématu

  1. Zkopírujte předchozí kód schématu a vložte ho do textového souboru. Uložte soubor jako targetNamespace.xml.

  2. Zkopírujte následující šablonu a vložte ji do textového souboru. Ulož soubor do targetNameSpaceT.xml stejného adresáře, kde jsi uložil targetNamespace.xml.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
        <sql:xpath-query mapping-schema="targetNamespace.xml"
            xmlns:CO="urn:MyNamespace">
            /CO:Customer[@CustomerID=1]
        </sql:xpath-query>
    </ROOT>
    

    Dotaz XPath v šabloně vrací prvek <Customer> zákazníka s CustomerID 1. Dotaz XPath specifikuje prefix jmenného prostoru pro prvek dotazu, nikoli pro atribut. (Lokální atributy nejsou kvalifikovány, jak je specifikováno ve schématu.)

    Cesta k adresáři určená pro mapovací schéma (targetNamespace.xml) je relativní adresáři, ve které je šablona uložena. Absolutní cestu lze také specifikovat, například:

    mapping-schema="C:\MyDir\targetNamespace.xml"
    
  3. Vytvořte a použijte testovací skript SQLXML 4.0 (Sqlxml4test.vbs) k provedení šablony.

    Další informace naleznete v tématu Použití ADO ke spouštění dotazů SQLXML 4.0.

Pokud schéma specifikuje elementFormDefault atributy s attributeFormDefault hodnotou "qualified", má instancový dokument všechny lokální prvky a atributy kvalifikované. Můžete změnit předchozí schéma tak, aby tyto atributy obsahovalo do prvku <xsd:schema> , a šablonu spustit znovu. Protože jsou nyní atributy také kvalifikované v instanci, dotaz XPath se změní tak, aby zahrnoval prefix jmenného prostoru.

Toto je upravený dotaz XPath:

/CO:Customer[@CO:CustomerID=1]

Toto je XML dokument, který se vrací:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
   <y0:Customer xmlns:y0="urn:MyNamespace" CustomerID="1" SalesPersonID="280">
      <Order SalesOrderID="43860" CustomerID="1" />
      <Order SalesOrderID="44501" CustomerID="1" />
      <Order SalesOrderID="45283" CustomerID="1" />
      <Order SalesOrderID="46042" CustomerID="1" />
   </y0:Customer>
</ROOT>