targetNamespace 특성을 사용하여 대상 네임스페이스 지정(SQLXML 4.0)
XSD 스키마를 작성할 때 XSD targetNamespace 특성을 사용하여 대상 네임스페이스를 지정할 수 있습니다. 이 항목에서는 XSD targetNamespace, elementFormDefault 및 attributeFormDefault 특성의 작동 원리와 생성되는 XML 인스턴스에 미치는 영향, 네임스페이스로 XPath 쿼리를 지정하는 방법에 대해 설명합니다.
xsd:targetNamespace 특성을 사용하면 기본 네임스페이스의 요소와 특성을 다른 네임스페이스에 넣을 수 있습니다. 또한 로컬로 선언된 스키마 요소 및 특성을 접두사를 사용하여 명시적으로 또는 암시적으로(기본 설정) 네임스페이스에서 정규화된 것으로 표시할지 여부를 지정할 수도 있습니다. <xsd:schema> 요소에 elementFormDefault 및 attributeFormDefault 특성을 사용하여 로컬 요소 및 특성의 정규화를 전역적으로 지정하거나 form 특성을 사용하여 개별 요소와 특성을 별도로 지정할 수 있습니다.
예
다음 예를 사용하여 작업 예제를 만들려면 특정 요구 사항이 충족되어야 합니다. 자세한 내용은 SQLXML 예 실행을 위한 요구 사항을 참조하십시오.
1. 대상 네임스페이스 지정
다음 XSD 스키마는 xsd:targetNamespace 특성을 사용하여 대상 네임스페이스를 지정합니다. 또한 이 스키마는 elementFormDefault 및 attributeFormDefault 특성 값을 "unqualified"(해당 특성의 기본값)로 설정합니다. 이는 전역 선언이며 모든 로컬 요소(스키마의 <Order>)와 특성(스키마의 CustomerID, ContactName 및 OrderID)에 적용됩니다.
<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>
스키마에서 다음을 확인하십시오.
CustomerType 및 OrderType 형식 선언은 전역 선언이므로 스키마의 대상 네임스페이스에 포함됩니다. 따라서 <Customer> 요소와 해당 <Order> 자식 요소의 선언에서 이러한 형식이 참조되면 대상 네임스페이스와 연결된 접두사가 지정됩니다.
<Customer> 요소도 스키마에서 전역 요소이므로 스키마의 대상 네임스페이스에 포함됩니다.
스키마에 대해 다음 XPath 쿼리를 실행합니다.
(/CO:Customer[@CustomerID=1)
이 XPath 쿼리를 실행하면 다음 인스턴스 문서가 생성됩니다. 여기에는 주문의 일부만 나와 있습니다.
<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>
이 인스턴스 문서는 urn:MyNamespace 네임스페이스를 정의하고 여기에 접두사(y0)를 연결합니다. 이 접두사는 <Customer> 전역 요소에만 적용됩니다. 이 요소는 스키마에서 <xsd:schema> 요소의 자식 요소로 선언되었기 때문에 전역 요소입니다.
스키마에서 elementFormDefault 및 attributeFormDefault 특성의 값이 **"unqualified"**로 설정되어 있으므로 로컬 요소 및 특성에는 접두사가 적용되지 않습니다. <Order> 요소는 <CustomerType> 요소를 정의하는 <complexType> 요소의 자식 요소로 선언되어 있으므로 로컬 요소입니다. 마찬가지로, 해당 특성(CustomerID, OrderID 및 ContactName)도 전역이 아니라 로컬 요소입니다.
이 스키마의 작업 예제를 만들려면
위 스키마 코드를 복사한 후 텍스트 파일에 붙여넣습니다. 파일을 targetNameSpace.xml로 저장합니다.
다음 템플릿을 복사한 후 텍스트 파일에 붙여넣습니다. 파일을 targetNamespace.xml을 저장한 디렉터리와 같은 디렉터리에 targetNameSpaceT.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>
이 템플릿의 XPath 쿼리는 CustomerID가 1인 고객의 <Customer> 요소를 반환합니다. XPath 쿼리에서 요소에 대해서만 네임스페이스 접두사가 지정되고 특성에 대해서는 지정되지 않는 것을 알 수 있습니다. 스키마에 지정된 대로 로컬 특성이 정규화되지 않는 것입니다.
매핑 스키마(targetNamespace.xml)에 대해 지정된 디렉터리 경로는 템플릿이 저장된 디렉터리에 상대적입니다. 또한 다음과 같이 절대 경로를 지정할 수 있습니다.
mapping-schema="C:\MyDir\targetNamepsace.xml"
SQLXML 4.0 테스트 스크립트(Sqlxml4test.vbs)를 만든 다음 이 스크립트를 사용하여 템플릿을 실행합니다.
자세한 내용은 ADO를 사용하여 SQLXML 쿼리 실행을 참조하십시오.
스키마에 elementFormDefault 및 attributeFormDefault 특성 값이 **"qualified"**로 지정되어 있으면 인스턴스 문서의 로컬 요소 및 특성이 모두 정규화됩니다. <xsd:schema> 요소에 이러한 특성이 포함되도록 앞서 소개한 스키마를 변경한 후 템플릿을 다시 실행할 수 있습니다. 이 경우 특성이 인스턴스에서도 정규화되므로 네임스페이스 접두사를 포함하도록 XPath 쿼리가 변경됩니다.
수정된 XPath 쿼리는 다음과 같습니다.
/CO:Customer[@CO:CustomerID=1]
반환되는 XML 문서는 다음과 같습니다.
<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>