Тип элемента xsd: boolean принимает "true", но не "True". Как я могу заставить его принять это? - PullRequest
49 голосов
/ 21 августа 2009

Я использую опцию xmllint --schema для проверки моего XML, который выглядит следующим образом

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

В моем файле схемы есть следующая строка, описывающая активный элемент.

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

Когда я запускаю xmllint, я получаю сообщения об ошибках с надписью

/ tmp / schema_validation.xml: 73: element Активен: Ошибка достоверности схемы: Элемент «Активный»: «Истина» не является действительное значение атомарного типа 'Хз: логическое значение'

.

Когда я меняю XML на

<Active>true</Active>

Тогда сообщение об ошибке исчезает.

Итак, это выглядит как xsd: boolean означает, что все это строчные буквы "true / false", но не "True / False" для xmllint .. Мой вопрос, как я могу заставить xmllint принимать "True" для типа xsd: boolean ? Или есть другие инструменты, которые я могу использовать для проверки этого XML? На данный момент я не могу изменить XML или схему.

Спасибо!

Ответы [ 3 ]

99 голосов
/ 21 августа 2009

Вы не можете.

В соответствии со спецификацией XML-схемы логическое значение равно true или false. True недействительно:


  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-схемы, вы не можете убедить его принять True для логического значения.

50 голосов
/ 21 августа 2009

xs:boolean предопределено в зависимости от того, какой тип ввода он принимает. Если вам нужно что-то другое, вы должны определить собственное перечисление:

 <xs:simpleType name="my:boolean">
    <xs:restriction base="xs:string">
      <xs:enumeration value="True"/>
      <xs:enumeration value="False"/>
    </xs:restriction>
  </xs:simpleType>
3 голосов
/ 20 марта 2014

Если вы работаете в Linux или у вас есть Cygwin в Windows, вы можете запустить входной XML с помощью простого сценария sed, который заменит <Active>True</Active> на <Active>true</Active>, например:

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