Неверное лексическое значение для значения атрибута с пробелами в указателе пути диапазона в MarkLogic - PullRequest
2 голосов
/ 14 марта 2020

Учитывая следующий HTML документ:

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta name="foo" content="bar" />
    <meta name="another item" content="12345" />
  </head>
  <body>
  </body>
</html>

Я создал указатель диапазона пути для значения <meta name="foo" content="bar" /> @content:

    {
        "scalar-type": "string",
        "collation": "http://marklogic.com/collation/en/S1",
        "range-value-positions": false,
        "invalid-values": "reject",
        "path-expression": "/*:html/*:head/*:meta[@name='foo']/@content"
    }

Однако я я получаю следующую ошибку при оценке xpath /*:html/*:head/*:meta[@name='foo']:

[1,0-мл] XDMP-LEXVAL: xs: NMTOKEN ("другой элемент") - неверное лексическое значение "другой элемент"

Например:

fn:doc('/test/test.xhtml')/*:html/*:head/*:meta[@name='foo']

Это также предотвратит прием новых документов с такой же структурой (из-за "invalid-values": " отклонить ").

Я не понимаю, откуда возникла ошибка. Кажется, если я уберу пробелы из всех имен метатегов, это будет работать. Но это не практическое решение. Спасибо!

1 Ответ

3 голосов
/ 14 марта 2020

Я подозреваю, что проблема вызвана другим meta тегом, один со 'another item' в качестве значения атрибута name.

Официальная схема X HTML говорит, что атрибут content может содержать любую строку, но атрибут name является так называемым xs:NMTOKEN. xs: NMTOKEN не допускает пробелы в значении.

Ваше выражение пути обращается к атрибуту name тегов meta. MarkLogi c необходимо извлечь значение этого атрибута, чтобы можно было сравнить его со строкой 'foo'. Однако в MarkLogi c предварительно загружено несколько XML схем общих стандартов. Он распознает пространство имен и пытается получить типизированное значение, основанное на официальной схеме, и будет жаловаться, если значение не соответствует.

Я думаю, у вас есть несколько вариантов:

  • использовать допустимые значения атрибута имени (может быть вне вашего контроля)
  • убрать пространство имен x html (звучит как перебор)
  • редактировать выражение пути для явного приведения значения имени в строку, используя что-то вроде: *:meta[string(@name)='foo']/@content

Примечание: выражения индекса пути не должны начинаться с root документа. Вы можете думать о них как о шаблонах совпадений в XSLT.

HTH!

...