xsd中不区分大小写的键

时间:2011-09-28 20:38:06

标签: validation xsd primary-key

我将XSD嵌入到这样的XML中:

<Replacements>
    <xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="Replacements">
            <xs:complexType>
                <xs:sequence>
                    <xs:element minOccurs="0" maxOccurs="unbounded" ref="Replace" />
                </xs:sequence>
            </xs:complexType>
            <xs:key name="ReplaceKey">
                <xs:selector xpath="./Replace"/>
                <xs:field xpath="@old"/>
            </xs:key>
        </xs:element>
        <xs:element name="Replace">
            <xs:complexType>
                <xs:attribute name="old" type="AnythingButLowerCase" use="required" />
                <xs:attribute name="new" type="xs:string" use="required" />
            </xs:complexType>
        </xs:element>
        <xs:simpleType name="AnythingButLowerCase">
            <xs:restriction base="xs:string">
                <xs:pattern value="[^a-z]+"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:schema>
    <Replace old="A1020____9" new="A1020"/>
    <Replace old="a1020____9" new="A1020"/>
</Replacements>

我使用xs:key在Replace元素的“old”属性上定义了一个唯一键 我的问题是我希望这个密钥是CASE-INSENSITIVE 我已经阅读了很多文档,表明我可以使用像大写或者翻译的xsd函数来解决这个问题,但是如果我写的话就像

<xs:field xpath="upper-case(@old)"/>

VS2010给我一个警告:

'upper-case(@old)' is an invalid XPath for selector or field.

我做错了什么?

谢谢:)

2 个答案:

答案 0 :(得分:1)

正确的XPath函数是“大写”,而不是“大写”。只需添加连字符。

答案 1 :(得分:0)

OK!
我明白了!

不允许在xpath:字段的xpath中使用函数。

我所寻求的解决方法是定义一个 simpleType 并在那里设置一个不允许使用小写字母的限制。
像这样:

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<Replacements>
    <xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="Replacements">
            <xs:complexType>
                <xs:sequence>
                    <xs:element minOccurs="0" maxOccurs="unbounded" ref="Replace" />
                </xs:sequence>
            </xs:complexType>
            <xs:key name="ReplaceKey">
                <xs:selector xpath="./Replace"/>
                <xs:field xpath="@old"/>
            </xs:key>
        </xs:element>
        <xs:element name="Replace">
            <xs:complexType>
                <xs:attribute name="old" type="AnythingButLowerCase" use="required" />
                <xs:attribute name="new" type="xs:string" use="required" />
            </xs:complexType>
        </xs:element>
        <xs:simpleType name="AnythingButLowerCase">
            <xs:restriction base="xs:string">
                <xs:pattern value="[^a-z]+"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:schema>
    <Replace old="A1020____9" new="A1020"/>
    <Replace old="a1020____9" new="A1020"/>
</Replacements>

现在这就是我想要的。