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规范 ,布尔值是true
或false
。 True
无效:
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>