在XSD元素名称中使用正则表达式

时间:2016-04-28 16:04:14

标签: regex xml xsd

我正在尝试为我的XML代码实现XSD。

    </transition>
    <!--The list of automata-->
    <Machine0/>
    <Machine1/>
    <Machine2/>
    <Machine3/>
  </automaton>
</structure>

问题在于Machine[i],每个XML文件中Machine[i]元素的数量发生了变化。

我已尝试使用此代码,但似乎无法正常工作:

<xs:complexType>
    <xs:sequence>
        <xs:any minOccurs="1" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:assertion test="every $x in * 
     satisfies matches(local-name($x), 'Machine[0-9]+')"/>
</xs:complexType> 

1 个答案:

答案 0 :(得分:1)

首先,注意几点:

  1. 最重要的是,如果您仍然可以对Machine元素的命名进行设计控制,请意识到您应该有一个很好的理由偏离优越的设计模式元素位置是隐含的,而不是在元素的名称中明确表示。我喜欢xs:assert,所以我不喜欢任何人给予XSD WG成员reasons to regret its inclusion in XSD 1.1。的; - )
  2. 这是xs:assert,而非xs:assertion(常见错字)。

  3. 您需要锚定正则表达式的开头和结尾。 (与xs:pattern不同,fn:matches()不会自动锚定其模式的开头和结尾。

  4. 除非您打算明确定义processContents="lax"元素,否则您需要="skip"MachineN

  5. XSD 1.1

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
        elementFormDefault="qualified"
        vc:minVersion="1.1">
    
        <xs:element name="r" type="rType"/>
    
        <xs:complexType name="rType">
            <xs:sequence>
                <xs:any minOccurs="1" maxOccurs="unbounded" processContents="lax"/>
            </xs:sequence>
            <xs:assert test="every $x in * satisfies 
                             matches(local-name($x), '^Machine[0-9]+$')"/>
        </xs:complexType> 
    </xs:schema>
    

    然后,这个XML

    有效案例#0

    <?xml version="1.0" encoding="UTF-8"?>
    <r>
        <Machine0/>
        <Machine1/>
    </r>
    
    根据您的XSD,

    有效 ,但这些XML文档

    无效案例#1

    <?xml version="1.0" encoding="UTF-8"?>
    <r>
        <xMachine0/>
        <Machine1/>
    </r>
    

    无效案例#2

    <?xml version="1.0" encoding="UTF-8"?>
    <r>
        <Machine0x/>
        <Machine1/>
    </r>
    

    无效案例#3

    <?xml version="1.0" encoding="UTF-8"?>
    <r>
        <Machine/>
        <Machine1/>
    </r>
    

    根据要求 无效