[英]Transforming from a XML Schema type to an other with 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>
这是纲要,我尝试从此转变:
<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)与叶子元素之间的高度耦合。 我试图找到一些强制转换函数,但是这些函数是针对基元的,我尝试使用xsi:type,并且尝试询问所有子元素并对其进行过滤。 我找不到工作方法。 有人遇到过这个吗? 谢谢!
昨天我对答案做了一些回合。 首先,我尝试进行Xpath查询,该查询向我过滤了子元素,如下所示:
declare function xf:testAddress($uKAddress1 as element())
as element() {
let $UKAddress := $uKAddress1
return
<ns0:Address>
{$UKAddress/*[local-name()=('name', 'street', 'city')]}
<ns0:Address>
};
(本地名称很重要:简单的name()将包含名称空间,或者更糟糕的是:伪名称空间,如果引擎使用了类似的方法)问题是,表达式的右侧不是动态的,当然XQuery没有帮助就看不到架构。 解决此问题的一种可能方法是以下脚本:
http://en.wikibooks.org/wiki/XQuery/XML_Schema_to_Instance
这样,我可以创建该地址的虚拟实例,然后可以使用该实例映射子代。 因此,这是一种解决方案,但我认为,这不是正确的方法,并且每次请求都会带来很多额外的工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.