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 или схемы не является моим вариантом на данный момент.
Спасибо!
Ответы
Ответ 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>