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

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


True

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


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

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

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

true

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

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

Спасибо!

 Cheeso22 авг. 2009 г., 18:44
вам нужно идти вверх по течению: остановить генерацию недопустимого XML в его источнике.
 Soichi Hayashi22 авг. 2009 г., 16:53
Я думал сделать это, но мне было страшно изменять значения, которые просто оказались "Правда", Например, если элемент называетсяОписание" бывает содержать значение "Правда"тогда я нене хочу, чтобы это было преобразовано в "правда", Я неЯ думаю, что есть какой-то способ узнать, какой элемент применить нормализацию или нет ..
 Mads Hansen21 авг. 2009 г., 19:47
Если изменение исходного XML или схемы не является вариантом, я бы предложил запустить исходный XML с помощью преобразования, которое нормализует логические значения до правильных допустимых значений XSD.

Ответы на вопрос(3)

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

     <xs:restriction base="xs:string">
      <xs:enumeration value="True">
      <xs:enumeration value="False">
    </xs:enumeration></xs:enumeration></xs:restriction>
  </xs:simpletype>
 Soichi Hayashi22 авг. 2009 г., 16:51
Спасибо! Я буду просить что-то вроде этого, чтобы быть частью схемы, чтобы я мог обойти это сейчас.
Решение Вопроса

СогласноСпецификация схемы XMLлогическое значениеtrue или же .falseTrue не является действительным:

  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 для логического значения.

 Florian F24 окт. 2017 г., 16:26
Дело в том, что генератор в восходящем направлении использует нестандартную интерпретацию схемы, поэтому OP требуется xmllint, который принимает ту же нестандартную интерпретацию схемы.
 avl_sweden15 янв. 2018 г., 14:54
На самом деле, 1, 0, также являются допустимыми значениями. Увидеть:w3schools.com/xml/schema_dtypes_misc.asp
 Oskar Berggren29 авг. 2015 г., 17:23
Иными словами, если вышестоящее программное обеспечение генерирует True для чего-то, определенного как логическое значение XML-схемы, то на самом деле они генерируют не XML, а что-то похожее. В этом случае их отдел маркетинга не должен утверждать, что они используют XML, поскольку теперь он лишил законной силы использовать XML - возможность повторного использования общих анализаторов для эффективности.
 LarsH06 апр. 2017 г., 17:04
Я бы не согласился с @Oskar здесь. Есть инструменты, которые утверждают, что генерируют XML, но на самом деле нет, потому что то, что они генерируют, не является правильно сформированным. Но здесь у вас, похоже, есть программное обеспечение, которое генерирует XML,является хорошо сформирован, но недействителен в соответствии со своей XML-схемой. Это'все еще XML. Они просто могутне утверждаю, что он соответствует XML-схеме, которую выповторное использование.
 Soichi Hayashi22 авг. 2009 г., 16:50
Благодарю. Это'хорошо знать, что нет абсолютно никакого способа переопределить xsd: boolean
 Cheeso13 нояб. 2017 г., 19:06
Re:OP needs a xmllint that accepts the same non-standard interpretation of the schema. , Там нет такой вещи. Инструменты нет "интерпретировать» схема. Схема говорит "XSD: логическое» и это означает, всегда, в любом случае, правда или ложь. Не правда. Не Ложь. Не 1. Не 0. Нет места для "интерпретация», Генератор не так и сломан.

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

cat <your xml="" file=""> | sed 'sX<active>True</active>X<active>true</active>X' | xmllint --schema -
</your>

;Тем не менее, вы все равно можете использовать не проверяющий процессор 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:value-of></xsl:for-each>
    </xsl:for-each>
    </xsl:template>
</xsl:output></xsl:stylesheet>
 JonBrave27 янв. 2017 г., 15:21
Осторожно: я сомневаюсь, что есть "простоsed сценарий» достаточно надежный, чтобы правильно выполнить подстановку, подобную этой, в XML-файле - у вас нет.

Ваш ответ на вопрос