Xerces-J xsd:base64二进制词汇验证问题

Xerces-J xsd:base64二进制词汇验证问题,xsd,xsd-validation,xerces,xerces2-j,Xsd,Xsd Validation,Xerces,Xerces2 J,我最近将我的项目从Xerces-J2.7.0升级到Xerces-J2.12.1,我看到模式验证行为发生了变化。我不完全清楚我的测试是错的还是Xerces错了 鉴于此模式: <?xml version='1.0'?> <xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'> <!-- Schema to test facets for the xsd:base64Binary datatype. -->

我最近将我的项目从Xerces-J2.7.0升级到Xerces-J2.12.1,我看到模式验证行为发生了变化。我不完全清楚我的测试是错的还是Xerces错了

鉴于此模式:

<?xml version='1.0'?>
<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
  <!-- Schema to test facets for the xsd:base64Binary datatype. -->
  <xsd:element name="facetTest" type="FacetTestComplexType"/>
  <xsd:complexType name="FacetTestComplexType">
    <xsd:sequence>
      <xsd:element name='enumeration' type='EnumerationType' minOccurs="0"/>
    </xsd:sequence>
  </xsd:complexType>

  <!-- ***** Enumeration ***** -->
  <xsd:simpleType name='EnumerationType'>
    <xsd:restriction base='xsd:base64Binary'>
      <xsd:enumeration value='Ab1+'/>
      <xsd:enumeration value='7 d Ec'/>
    </xsd:restriction>
  </xsd:simpleType>
</xsd:schema>

本实例文件:

<facetTest>
  <enumeration>7dEc</enumeration>
</facetTest>

12月7日
对于Xerces-J 2.7.0,该实例文档将是有效的,但是当使用Xerces-J 2.12.1时,它现在被标记为无效

我查看了,但不清楚这是否有效(我的代码是正确的,Xerces-J是错误的),或者反之亦然。这段话让我想起:

注意,该语法要求词法形式中非空白字符的数量为4的倍数,且等号仅出现在词法形式的末尾;不满足这些约束的字符串不是base64二进制的合法词法形式,因为base64解码器无法成功解码它们

注:上述词汇空间的定义比[RFC 2045]中给出的关于空格的定义更具限制性——这在实践中不是一个问题。任何与RFC兼容的字符串都可以出现在由该类型验证的元素或属性中,因为该类型的·whiteSpace·facet固定为collapse,这意味着在强制执行上述语法之前,所有前导和尾随空格都将被剥离,所有内部空格将被折叠为单空格字符

根据枚举的定义,它限制值空间,而不是词法空间。在这种情况下,值空间似乎覆盖了原始二进制内容。如果是这样的话,那么空格应该是没有意义的

如果您能澄清我的代码或Xerces是否不正确,我们将不胜感激。

我认为您的代码是正确的,Xerces已经开始表现不正确

尽管枚举中的base64值看起来很奇怪,但它们确实符合此处指定的语法:

这是XSD规范关于枚举方面的说明:

验证规则:枚举有效: 如果值是{value}中指定的值之一,则·值空间·中的值相对于·枚举·是有效的

因此,我同意你的说法:

根据枚举的定义,它限制值空间,而不是词法空间。在这种情况下,值空间似乎覆盖了原始二进制内容