xsd:boolean element type接受“true”但不接受“True”。我怎么能让它接受呢?

时间:2009-08-20 20:04:57

标签: xml xsd boolean

我正在使用xmllint --schema选项来验证我的XML

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

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

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

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

  

/tmp/schema_validation.xml:73:元素   活动:架构有效性错误:   元素'活跃':'真'不是   原子类型的有效值   'XS:布尔'。

当我将XML更改为

<Active>true</Active>

然后错误消息消失。

所以,它看起来像xsd:boolean意味着它全是小写的“true / false”而不是xmllint的“True / False”..我的问题是,如何使xmllint接受xsd的“True”:boolean类型?或者我可以使用哪些工具来验证这个XML?此时更改XML或架构不是我的选择。

谢谢!

3 个答案:

答案 0 :(得分:99)

你做不到。

根据XML Schema specification,布尔值为truefalseTrue无效:


  3.2.2.1 Lexical representation
  An instance of a datatype that is defined as ·boolean· can have the 
  following legal literals {true, false, 1, 0}. 

  3.2.2.2 Canonical representation
  The canonical representation for boolean is the set of 
  literals {true, false}. 

如果您使用的工具真正验证了XML Schema标准,那么您无法说服它接受True作为布尔值。

答案 1 :(得分:50)

xs:boolean是根据它接受的输入类型预定义的。如果您需要不同的东西,则必须定义自己的枚举:

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

答案 2 :(得分:3)

如果您使用的是Linux,或者在Windows上提供了cygwin,则可以通过简单的sed脚本运行输入XML,该脚本将<Active>True</Active>替换为<Active>true</Active>,如下所示:

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

如果你不是,你仍然可以使用一个非验证的xslt pocessor(xalan,saxon等)在输入上运行一个简单的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>