使用XQuery从XML Schema类型转换为其他类型

时间:2012-04-11 13:18:52

标签: xml xsd xquery

我试图找出如何将扩展(“扩展”)XML Schema元素转换为原始元素的形式。示例场景如下:

<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="http://www.example.com/address"
        xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:add="http://www.example.com/address"
        elementFormDefault="qualified">

 <complexType name="Address">
   <sequence>
     <element name="name" type="string"/>
     <element name="street" type="string"/>
     <element name="city" type="string"/>
   </sequence>
 </complexType>

 <complexType name="UKAddress">
   <complexContent>
     <extension base="add:Address">
       <sequence>
         <element name="postcode" type="ipo:UKPostcode"/>
       </sequence>
       <attribute name="exportCode" type="positiveInteger" fixed="1"/>
     </extension>
   </complexContent>
 </complexType>

 <simpleType name="UKPostcode">
    <restriction base="string">
        <pattern value="[A-Z]{1,2}[0-9R][0-9A-Z]? [0-9][A-Z]{2}"/>
    </restriction>
 </simpleType>

 <element name="UKAddress" type="add:UKAddress" />
 <element name="Address" type="add:Address" />
</schema>

这是Schema,我试图转换它:

<UKAddress xmlns="http://www.example.com/address" exportCode="1">
    <name>Address1</name>
    <street>Example street</street>
    <city>London</city>
    <postcode>AA00 0AA</postcode>
</UKAddress>

进入这个:

<UKAddress xmlns="http://www.example.com/address">
    <name>Address1</name>
    <street>Example street</street>
    <city>London</city>
</UKAddress>

不是逐个转换所有子元素(这很好用),但是使用一些通用方法,比如强制转换。重点是以某种方式使用Address元素的类似继承的结构,并避免map(Xquery)和leaf-elements之间的高度耦合。我试图找到一些强制转换函数,但是那些用于原语,我试图使用xsi:type,我试图询问所有的子元素,并过滤它们。我找不到工作方式。有没有人见过这个?谢谢!

1 个答案:

答案 0 :(得分:0)

昨天我得到了一些答案。起初,我尝试创建一个Xpath查询,它将子元素过滤给我,如下所示:

declare function xf:testAddress($uKAddress1 as element())
    as element() {
        let $UKAddress := $uKAddress1
        return
            <ns0:Address>
                {$UKAddress/*[local-name()=('name', 'street', 'city')]}
            <ns0:Address>
};

(local-name很重要:simple name()将包含命名空间,或者最差:虚拟命名空间,如果引擎使用这样的东西)问题是,表达式的右侧不是动态的,并且XQuery当然无法在没有帮助的情况下看到Schema。解决此问题的可能方法是以下脚本:

http://en.wikibooks.org/wiki/XQuery/XML_Schema_to_Instance

有了这个,我可以创建一个地址的虚拟实例,然后我可以使用这个实例映射孩子。所以这是一种解决方案,但我认为,这不是正确的方法,而且每次请求都需要额外的工作。