xsd:boolean type d'élément accepter "vrai", mais pas "Vrai". Comment puis-je l'accepter?

j'utilise l'option xmllint -- schema pour valider mon XML qui ressemble à ceci

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

Dans mon fichier de schéma, j'ai la ligne suivante qui décrit l'élément Actif.

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

quand j'exécute xmllint, j'obtiens des messages d'erreur qui disent

/tmp/schema_validation.xml: 73: élément Actif: erreur de validité du schéma : Élément "actif": "vrai" n'est pas un valeur valide du type atomique "xs: booléen".

quand je change le XML

<Active>true</Active>

alors le message d'erreur disparaît.

donc, il ressemble à xsd: booléen signifie que tout est en minuscules " vrai / faux "mais pas" vrai/faux " à xmllint.. Ma question Est, Comment puis-je faire xmllint pour accepter "True" pour le type xsd:boolean? Ou y a-t-il différents outils que je peux utiliser pour valider ce XML? Modifier le XML ou le schéma n'est pas mon option à ce stade.

Merci!

46
demandé sur Akhilesh Kumar 2009-08-21 00:04:57

3 réponses

Vous ne pouvez pas.

Selon spécification du schéma XML, un booléen true ou false. True n'est pas valide:


  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}. 

si l'outil que vous utilisez valide vraiment la norme XML Schema, alors vous ne pouvez pas le convaincre D'accepter True pour un booléen.

94
répondu Cheeso 2009-08-20 20:12:52

xs:boolean est prédéfini en fonction du type d'entrée qu'il accepte. Si vous avez besoin de quelque chose de différent, vous devez définir votre propre énumération:

 <xs:simpleType name="my:boolean">
    <xs:restriction base="xs:string">
      <xs:enumeration value="True"/>
      <xs:enumeration value="False"/>
    </xs:restriction>
  </xs:simpleType>
48
répondu Pavel Minaev 2009-08-20 20:16:50

si vous êtes sous Linux, ou si vous avez cygwin disponible sous Windows, vous pouvez exécuter le XML d'entrée par un simple script sed qui remplacera <Active>True</Active><Active>true</Active>, comme ceci:

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

si vous ne l'êtes pas, vous pouvez toujours utiliser un pocessor xslt Non-validant (xalan, saxon etc.) pour exécuter une transformation xslt simple sur l'entrée, et seulement alors le pipe à xmllint.

ce que le XSL devrait contenir quelque chose comme ci-dessous, pour l'exemple que vous avez indiqué ci-dessus (le processeur xslt devrait être Compatible 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>
3
répondu Anonymous Coward 2014-03-20 11:20:09