【问题标题】:False Unique Particle Attribution (UPA)错误的唯一粒子属性 (UPA)
【发布时间】:2014-08-30 03:29:45
【问题描述】:

给定以下两种模式

(根)

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:someNs="first" 
            xmlns:someOtherNs="second"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            elementFormDefault="unqualified"
            attributeFormDefault="unqualified" 
            version="1.0" 
            targetNamespace="first">
  <xsd:import namespace="second" schemaLocation="./child.xsd" />
  <xsd:element name="employee" type="someNs:fullpersoninfo" />

  <xsd:complexType name="personinfo">
    <xsd:sequence>
      <xsd:element name="firstname" type="xsd:string" />
      <xsd:element name="lastname" type="xsd:string" />
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="fullpersoninfo">
    <xsd:complexContent>
      <xsd:extension base="someNs:personinfo">
        <xsd:sequence>
          <xsd:element name="address" type="xsd:string" />
          <xsd:element name="city" type="xsd:string" />
          <xsd:element name="country" type="xsd:string" />
          <xsd:group ref="someOtherNs:Child" />
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
</xsd:schema>

和(孩子)

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="someId-1" 
           targetNamespace="second" 
           elementFormDefault="qualified" 
           xmlns:someOtherNs="second"
           xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           xmlns="second">

  <xs:element name="ChildElement" type="ChildElement"
              nillable="false" />

  <xs:complexType name="ChildElement">
    <xs:sequence>
      <xs:element name="firstname" type="xs:string" />
      <xs:element name="lastname" type="xs:string" />
    </xs:sequence>
  </xs:complexType>

  <xs:group name="Child">
    <xs:sequence>
      <xs:element ref="ChildElement" minOccurs="0" maxOccurs="1" />
      <xs:any processContents="lax" minOccurs="0" 
              maxOccurs="unbounded"
              namespace="##other" />
    </xs:sequence>
  </xs:group>

</xs:schema>

不应该出现唯一的粒子属性,因为孩子使用elementFormDefault="qualified",而根使用elementFormDefault="unqualified"。但是,当通过 Java 的 xjc 运行时,无法使用生成的类,因为类上的注释似乎不够——至少看起来如此。如何避免 UPA?

有问题的错误如下:

org.xml.sax.SAXParseException;行号:8;列号:41; cos-nonambig:"second":ChildElement 和 WC[##other:"first"] (或它们替换组中的元素)违反“唯一粒子属性”。在针对此模式进行验证期间,将为这两个粒子创建歧义。

【问题讨论】:

  • 对于哪个声明,您收到 UPA 错误?请将确切的错误消息粘贴到您的问题中。谢谢。

标签: java xml jaxb xsd xjc


【解决方案1】:

引用的错误消息表明架构处理器将&lt;xs:any namespace="##other" .../&gt; 解释为允许不在命名空间first 中的任何元素。也就是说,它将组引用视为简单的宏扩展,然后在根模式文档的上下文中创建模型组组件(其中##other 将引用除目标命名空间first 之外的任何命名空间),而不是在子架构文档的上下文中创建它们(其中##other 将引用除目标命名空间second 之外的任何命名空间)。

可能会出现section 3.10.2 of the XSD 1.0 spec 要求在 child.xsd 上下文中解释 ##other 的情况:当 namespace="##other" 时,通配符组件上的 {namespace constraint} 属性的值被描述为“a not&lt;schema&gt; 祖先元素信息项的 targetNamespace [attribute] 的 ·actual value· 如果存在,否则 ·absent·" -- 对于 child.xsd 中的 xs:any 元素,targetNamespace 属性具有值second,而不是first

一个例子可能是另一种方式:规范也很清楚,对命名模型组的引用在组件级别是不可见的,本地元素声明的范围由模型组的位置决定参考,而不是模型组定义的位置等。在这种情况下,XSD 规范意味着这里的##other 不应具有“除first 之外的任何命名空间”的解释,这似乎是非常不合理的.

总的来说,我倾向于第一种解释,但我非常怀疑是否有可能说服工具的创建者改变他们对规范的解释:命名模型组的扩展规则太混乱了并且涉及过多的挥手以轻易说服任何人他们的解释是错误的。

[哎呀。以下所谓的“解决方法”根本不是解决方法:它只是引发处理器当前表现的行为的另一种更清晰的方法。对此感到抱歉。]

一种解决方法:将命名模型组声明添加到您的根架构文档中,并引用那个,而不是 child.xsd 中的那个。因此,将其添加到根架构文档中:

<xs:group name="Child">
  <xs:sequence>
    <xs:element ref="someOtherNs:ChildElement" 
                minOccurs="0" 
                maxOccurs="1" />
    <xs:any processContents="lax" 
            minOccurs="0" 
            maxOccurs="unbounded"
            namespace="##other" />
  </xs:sequence>
</xs:group>

并从

更改引用
<xsd:group ref="someOtherNs:Child" />

<xsd:group ref="someNs:Child" />

[非工作“解决方法”结束。现在,让我们再试一次。]

解决您的问题的一种方法是,如果您真的希望您的工具将 fullpersoninfo 类型中的通配符解释为允许不在 second 命名空间中的任何元素,则将类型 fullpersoninfo 移动到second 命名空间。要将 address 等保留在 first 命名空间中,请使用 first 命名空间中的模型组定义模型组:

<xs:group name="additional-person-info">
  <xs:sequence>
    <xs:element ref="address" ... />
    ...

second 命名空间中声明fullpersoninfo

<xsd:complexType name="fullpersoninfo">
  <xsd:complexContent>
    <xsd:extension base="someNs:personinfo">
      <xsd:sequence>
        <xsd:group ref="someNs:additional-person-info"/>
        <xsd:group ref="someOtherNs:Child" />
      </xsd:sequence>
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>

以通常的方式从employee 的声明中引用fullpersoninfo

<xsd:element name="employee" type="someOtherNs:fullpersoninfo" />

如果您确实不希望这样的元素有效,则需要使用不同的方法:

<employee xmlns="first" xmlns:x="second">
  <firstname>Andrea</firstname>
  <lastname>Doria</lastname>
  <address/>
  <city/>
  <country/>
  <firstname>Andrew</firstname>
  <lastname>Carnegie</lastname>
</employee>

如果通配符匹配不在first 命名空间中的任何内容,您可能会决定您实际上更喜欢它——但在这种情况下,{second}ChildElement 匹配通配符,您不需要在内容模型中提及它完全没有。

您可能决定要匹配的内容是当前版本的架构中未声明的任何内容——但为此,您的工具中需要具备 XSD 1.1 意识。如果你有 1.1 的意识,你得到的内容模型就不会被拒绝(尽管它仍然可能有一个让你感到惊讶的解释)。

【讨论】:

  • C. M. Sperberg-McQueen,感谢您非常详尽的解释。但是,正如我所看到的 - 我避免这种情况的唯一方法是使用 XSD 1.1。问题是我几乎受制于现有模式,因为我所展示的内容是我要遵循的另一个标准的摘录 - EPCIS 标准 1.0.1 (gs1.org/gsmp/kc/epcglobal/epcis/…) - 第 9.1 节。据我所见 - 呈现的模式反映了扩展标准时所需的内容。然而,对我来说,这似乎更像是一个工具问题(XJC 是罪人)
猜你喜欢
  • 2018-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多