2017-02-08 124 views
2

我有一个模式,我想将simpleType转换为匿名simpleType。原图如下,我做了几次尝试,如:XML模式:将简单类型转换为匿名类型

删除base =“xxx”;

在扩展名之后添加simpleType;

等...

但结束了无效的架构。

问题

  1. 如何将输入转化为有效的匿名简单类型模式,而不丢失信息?
  2. 此外,有没有xslt做到这一点自动与动态输入的元素名称,类型名称等?

由于提前,

输入模式

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns="test" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="test" elementFormDefault="qualified"> 
<xs:element name="elem1"> 
    <xs:complexType> 
     <xs:simpleContent> 
      <xs:extension base="simpleType1"> 
       <xs:attribute name="att1" type="simpleType2" use="required"/> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 
<xs:simpleType name="simpleType1"> 
    <xs:restriction base="xs:decimal"> 
     <xs:fractionDigits value="5"/> 
     <xs:totalDigits value="18"/> 
     <xs:minInclusive value="0"/> 
    </xs:restriction> 
</xs:simpleType> 
<xs:simpleType name="simpleType2"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="[A-Z]{3,3}"/> 
    </xs:restriction> 
</xs:simpleType> 
</xs:schema> 

我尝试的结果:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns="test" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="test" elementFormDefault="qualified"> 
<xs:element name="elem1"> 
    <xs:complexType> 
     <xs:simpleContent> 
      <xs:extension> 
       <xs:simpleType> 
        <xs:restriction base="xs:decimal"> 
         <xs:fractionDigits value="5"/> 
         <xs:totalDigits value="18"/> 
         <xs:minInclusive value="0"/> 
        </xs:restriction> 
       </xs:simpleType> 
       <xs:attribute name="att1" use="required"/> 
       <xs:simpleType> 
        <xs:restriction base="xs:string"> 
         <xs:pattern value="[A-Z]{3,3}"/> 
        </xs:restriction> 
       </xs:simpleType> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 
</xs:schema> 

验证表明,这是错误的,如无效的架构:

元素中需要属性“base”。

元素不允许在元素下。

元素中需要属性'name'。

回答

1

在声明一个元素同时具有受限内容和属性时,XSD不可能使用纯粹的匿名局部定义。

你可以,当然,使用本地定义单独的属性(att1)的类型,但你不能为元素(elem1)的限制简单内容的类型(simpleType1),如果您还需要在elem1上声明att1

参见:How to restrict element content when element has attribute

+0

是的,事实上,我已经成功地使用本地定义类型的属性,但不能与simpleType1的“扩展基础”做... – dellair