web-dev-qa-db-ja.com

xsd:boolean要素タイプは「true」を受け入れますが、「True」は受け入れません。どうすればそれを受け入れることができますか?

Xmllint --schemaオプションを使用して、このようなXMLを検証しています

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

スキーマファイルには、アクティブな要素を説明する次の行があります。

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

Xmllintを実行すると、エラーメッセージが表示されます

/tmp/schema_validation.xml:73:要素のアクティブ:スキーマの妥当性エラー:要素の「アクティブ」:「True」はアトミックタイプ「xs:boolean」の有効な値ではありません。

XMLを変更するとき

<Active>true</Active>

その後、エラーメッセージが消えます。

だから、xsd:booleanはすべて小文字の「true/false」であり、xmllintでは「True/False」ではないように見えます。または、このXMLを検証するために使用できるさまざまなツールがありますか? XMLまたはスキーマを変更することは、現時点では私のオプションではありません。

ありがとう!

50
Soichi Hayashi

できません。

XML Schema specification によると、ブール値はtrueまたはfalseです。 Trueは無効です:

 
 3.2.2.1字句表現
・boolean・として定義されているデータ型のインスタンスは、
に続く正当なリテラル{true、false、1、 0}。 
 
 3.2.2.2正規表現
ブール値の正規表現は、
リテラル{true、false}のセットです。 

使用しているツールがXMLスキーマ標準に対して真に検証されている場合、ブール値に対してTrueを受け入れるように説得することはできません。

102
Cheeso

xs:booleanは、それが受け入れる入力の種類に関して事前定義されています。別の何かが必要な場合は、独自の列挙を定義する必要があります。

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

Linuxを使用している場合、またはWindowsでcygwinを使用できる場合は、次のように<Active>True</Active><Active>true</Active>に置き換える単純なsedスクリプトを介して入力XMLを実行できます。

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

そうでない場合でも、未検証のxsltプロセッサ(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>
3