Вопрос:
Вот мое содержимое файла product.xml:
<ProductCode>ABC</ProductCode>
И вот соответствующая проверяющая схема, содержимое файла product.xsd:
<?xml version=»1.0″ encoding=»utf-8″?> <xsd:schema version=»1.0″ xmlns:xsd=»http://www.w3.org/2001/XMLSchema»> <xsd:element name=»ProductCode»> <xsd:simpleType> <xsd:restriction base=»xsd:string»> <xsd:minLength value=»1″/> <xsd:maxLength value=»15″/> <xsd:pattern value=»[P{Ll}]*»></xsd:pattern> </xsd:restriction> </xsd:simpleType> </xsd:element>
Я открываю оболочку командной строки и использую xmlstarlet для проверки xml:
xmlstarlet val -e —xsd product.xsd product.xml product.xml:1.31: Element ‘ProductCode’: [facet ‘pattern’] The value ‘ABC’ is not accepted by the pattern ‘[P{Ll}]*’. product.xml:1.31: Element ‘ProductCode’: ‘ABC’ is not a valid value of the local atomic type. product.xml — invalid
Затем я попытался использовать xmllint для проверки xml:
└xmllint -schema product.xsd product.xml <?xml version=»1.0″?> <ProductCode>ABC</ProductCode> Element ‘ProductCode’: [facet ‘pattern’] The value ‘ABC’ is not accepted by the pattern ‘[P{Ll}]*’. Element ‘ProductCode’: ‘ABC’ is not a valid value of the local atomic type. product.xml fails to validate
Я потратил пару часов на это, и я обнаружил, что могу заставить его работать, удалив прилагаемые скобки:
<xsd:pattern value=»P{Ll}*»></xsd:pattern>
Я могу сохранить прилагаемые скобки и заставить их работать, используя категорию включения /p включительно и предшествующий ей отрицанием ^:
<xsd:pattern value=»[^p{Ll}]*»></xsd:pattern>
Кажется, что есть ошибка в базовой реализации xmllint и xmlstarlet, и мне нужно подтверждение, если это действительно так.
Используемые мной версии:
xmllint:
xmllint —version xmllint: using libxml version 20904 compiled with: Threads Tree Output Push Reader Patterns Writer SAXv1 FTP HTTP DTDValid HTML Legacy C14N Catalog XPath XPointer XInclude Iconv ISO8859X Unicode Regexps Automata Expr Schemas Schematron Modules Debug Zlib Lzma
xmlstarlet:
xmlstarlet —version 1.6.1 compiled against libxml2 2.9.1, linked with 20904 compiled against libxslt 1.1.28, linked with 10129
Дополнительная информация
Используя python как закодированный в фрагментах в фрагментах проверки схемы XML-схемы python, я обнаружил, что product.xsd также не проверяет product.xml. Трудно поверить, что у python также есть эта ошибка. Итак, теперь я ищу какое-то объяснение, почему выражение модели в product.xsd не работает.
Возникает вопрос: почему закрывающая скобка не может работать с эксклюзивным /P {Ll}?
Дополнительная информация
С другой стороны, используя фрагмент scala здесь, он может проверить product.xml через product.xsd. Итак, теперь мы можем подтвердить, что синтаксис шаблона в product.xsd правильный. Тем не менее, xmllint, xmlstarlet и python не смогли проверить его. Что здесь происходит?