我的XML文件如下:
<root>
<template>
<unknownTag>
<anotherUnknownTag/>
<anotherKnownTag/>
<field name='price'/>
</unknownTag>
</template>
<template>
<field name='salary'/>
</template>
<anothorKnownTag/>
</root>
我想将正则表达式限制应用于标记name
的属性<field/>
,无论它是孩子还是孙子或孙子等等。
我尝试了以下代码,但正则表达式只适用于元素字段,因为它是template
标记的直接子代。
<xs:element name="template">
<xs:complexType>
<xs:complexContent>
<xs:sequence>
<xs:element name="field">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-z][a-z_]*"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:any processContents="lax"/>
</xs:sequence>
</xs:complexType>
</xs:element>
答案 0 :(得分:0)
您实际上可以在XSD 1.0中表达所请求的约束:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="field">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-z][a-z_]*"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:schema>
注意:您甚至可以将root
简化为
<xs:element name="root"/>
但是较长的形式不那么神秘。
<?xml version="1.0" encoding="UTF-8"?>
<root>
<template>
<unknownTag>
<anotherUnknownTag/>
<anotherKnownTag/>
<field name="price"/>
</unknownTag>
</template>
<template>
<field name="salary"/>
</template>
<anothorKnownTag/>
</root>
由于field/@name
值与正则表达式不匹配,以下XML有两个有效性错误:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<template>
<unknownTag>
<anotherUnknownTag/>
<anotherKnownTag/>
<field name="price999"/>
</unknownTag>
</template>
<template>
<field name="big salary"/>
</template>
<anothorKnownTag/>
</root>