Поиск Xpath по его значению в XML-документах и ​​получение URI документа из Marklogic

У меня есть XML, хранящийся в MarkLogic, как указано ниже

<testData>
  <datatypes>
    <datatypename>datatypename1</datatypename>
    <datatype>datatype1</datatype>
  </datatypes>
  <datavalue>
    <code>code1</code>
    <value>value1</value>
  </datavalue>
  <datavalue>
    <code>code2</code>
    <value>value2</value>
  </datavalue>
  <datavalue>
    <code>code3</code>
    <value>value3</value>
  </datavalue>
</testData>

и существует вероятность того, что указанные выше значения и структура документа могут появиться в другом XML, но с другим URI.

Итак, мое требование: мне нужны все URI документов из MarkLogic, которые содержат /testData/datatypes/datatypename как точный xpath и его точное значение как datatypename1


person Shivling Bhandare    schedule 24.04.2018    source источник


Ответы (1)


Самый простой подход - создать индекс диапазона путей на /testData/datatypes/datatypename и использовать запрос диапазона путей:

cts:path-range-query("/testData/datatypes/datatypename", "=", "datatypename1")

Альтернативой является использование запроса значений в запросах элементов области видимости:

cts:element-query(xs:QName("testData"), 
  cts:element-query(xs:QName("datatypes"), 
    cts:element-value-query(xs:QName("datatypename"), "datatypename1"))) 

Такой подход более подвержен ложным срабатываниям. Для небольших наборов результатов кандидатов такие ложные срабатывания могут быть уменьшены путем фильтрации.

Для больших наборов результатов кандидатов позиционные ложные срабатывания (например, документ, в котором есть testData/datatypes и datatypes/datatypename, но не testData/datatypes/datatypename) могут быть устранены путем индексации позиций элементов. Если для совпадения характерны знаки препинания, токенизация значения также приведет к ложным срабатываниям. В таких случаях индексы диапазона путей являются правильным решением для больших наборов результатов-кандидатов.

person ehennum    schedule 25.04.2018
comment
ЕСЛИ у вас есть возможность изменять формат (схему) XML, альтернативой является размещение имени типа данных (и, возможно, всего документа) в другом / уникальном пространстве имен, чтобы «{namespace} datatypename» само по себе было уникальным. Тогда запросы значений элементов будут точными, и даже базовый xpath, вероятно, будет оптимизирован (например, // ns: datatypename [. = Value]) - person DALDEI; 22.05.2018