xml schema中unique无法识别默认命名空间的问题

今天在写schema的时候,遇到一个问题如下
例如schema文件代码:

[code]
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xsd:element name="rootElement">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="elementOne" maxOccurs="unbounded">
<xsd:complexType>
<xsd:attribute name="elementOneKey" type="xsd:integer"/>
<xsd:attribute name="elementOneDesc" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:unique name="EOneKeyU">
<xsd:selector xpath=".//elementOne"/>
<xsd:field xpath="@elementOneKey"/>
</xsd:unique>
</xsd:element>
</xsd:schema>
[/code]

这里对elementOne元素的elementOneKey属性设置了唯一性,在测试过程中,首先用以下XML代码进行测试:

[code]
<?xml version="1.0" encoding="UTF-8"?>
<rootElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schema.xsd">
<elementOne elementOneKey="1" elementOneDesc="a"/>
<elementOne elementOneKey="1" elementOneDesc="b"/>
</rootElement>
[/code]

因为elementOneKey的取值重复,验证报错,这个XML是通过本地文件直接指定schema的,并没有使用命名空间,为了使用命名空间指定,将两个文件的改为如下:
schema
[code]
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.uniquetest.com/uniquetest"
targetNamespace="http://www.uniquetest.com/uniquetest"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xsd:element name="rootElement">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="elementOne" maxOccurs="unbounded">
<xsd:complexType>
<xsd:attribute name="elementOneKey" type="xsd:integer"/>
<xsd:attribute name="elementOneDesc" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:unique name="EOneKeyU">
<xsd:selector xpath=".//elementOne"/>
<xsd:field xpath="@elementOneKey"/>
</xsd:unique>
</xsd:element>
</xsd:schema>
[/code]

XML:
[code]
<?xml version="1.0" encoding="UTF-8"?>
<rootElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.uniquetest.com/uniquetest"
xsi:schemaLocation="http://www.uniquetest.com/uniquetest schema.xsd">
<elementOne elementOneKey="1" elementOneDesc="a"/>
<elementOne elementOneKey="1" elementOneDesc="b"/>
</rootElement>
[/code]

按照schema的约定,该XML验证时将会出错,然而事实上却并没有如期报错,正常保存,为了这个问题我简直抓破脑袋,后来终于搞清楚原因了,就是因为xpath1.0不认识默认名称空间,它会把默认名称空间的元素当作无名称空间元素,默认名称空间元素根本无法被正确识别,所以需要明确的加前缀。

因此我就把schema改成:

[code]
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tst="http://www.uniquetest.com/uniquetest"
targetNamespace="http://www.uniquetest.com/uniquetest"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xsd:element name="rootElement">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="elementOne" maxOccurs="unbounded">
<xsd:complexType>
<xsd:attribute name="elementOneKey" type="xsd:integer"/>
<xsd:attribute name="elementOneDesc" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:unique name="EOneKeyU">
<xsd:selector xpath=".//tst:elementOne"/>
<xsd:field xpath="@elementOneKey"/>
</xsd:unique>
</xsd:element>
</xsd:schema>
[/code]

将默认命名空间改成前缀为tst,然后xpath指向".//tst:elementOne",接着就搞定,验证正常,希望本文对遇到同一问题的朋友能有所帮助吧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值