Подтвердить что ты не робот

Xsd: тип элемента boolean принимает "true", но не "True". Как я могу заставить его это принять?

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

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

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

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

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

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

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

<Active>true</Active>

Затем сообщение об ошибке исчезает.

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

Спасибо!

4b9b3361

Ответ 1

Вы не можете.

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

Ответ 2

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

Если вы работаете в Linux или имеете cygwin в Windows, вы можете запустить входной XML через простой sed script, который заменит <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>