xsd:布尔元素types接受“true”但不是“True”。 我怎样才能让它接受呢?

我正在使用xmllint –schema选项来validation我的XML,看起来像这样

<XML> <Active>True</Active> </XML> 

在我的模式文件中,我有以下描述Active元素的行。

 <xsd:element name="Active" type="xsd:boolean" /> 

当我运行xmllint,我收到错误消息说

/tmp/schema_validation.xml:73:element Active:Schemas有效性错误:元素'Active':'True'不是primefacestypes'xs:boolean'的有效值。

当我将XML更改为

 <Active>true</Active> 

然后错误消息消失。

所以,它看起来像xsd:布尔值意味着它是全部小写“真/假”,但不是“真/假”xmllint ..我的问题是,我怎样才能让xmllint接受“真”的xsd:布尔types? 还是有不同的工具,我可以使用,将validation这个XML? 在这一点上,更改XML或模式不是我的select。

谢谢!

你不能。

根据XML Schema规范 ,布尔值是truefalseTrue无效:


   3.2.2.1词汇表示
  被定义为·布尔值的数据types的一个实例可以有 
  遵循法律文字{true,false,1,0}。 

   3.2.2.2规范表示
  布尔的规范表示forms是 
  文字(真,假)。 

如果您正在使用的工具确实根据XML模式标准进行validation,那么您无法说服它接受布尔值为True。

xs:boolean是预定义的,它接受什么样的input。 如果你需要不同的东西,你必须定义你自己的枚举:

  <xs:simpleType name="my:boolean"> <xs:restriction base="xs:string"> <xs:enumeration value="True"/> <xs:enumeration value="False"/> </xs:restriction> </xs:simpleType> 

如果你在Linux上,或者在Windows上有cygwin,你可以通过一个简单的sed脚本来运行inputXML,它将用<Active>True</Active>replace<Active>True</Active> <Active>true</Active> ,如下所示:

 cat <your XML file> | sed 'sX<Active>True</Active>X<Active>true</Active>X' | xmllint --schema - 

如果你不是,你仍然可以使用一个非validation的xslt转储器(xalan,saxon等)在input上运行一个简单的xslt转换,然后将其转换为xmllint。

xsl应该包含如下所示的内容,对于上面列出的示例(xslt处理器应该是2.0):

 <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/"> <xsl:for-each select="XML"> <xsl:for-each select="Active"> <xsl:value-of select=" replace(current(), 'True','true')"/> </xsl:for-each> </xsl:for-each> </xsl:template> </xsl:stylesheet>