Как я могу проверить XML-файлы по нескольким определениям схемы в MarkLogic? - PullRequest
1 голос
/ 06 ноября 2019

Я работаю в базе данных MarkLogic, которая содержит приблизительно 130 000 документов XML. Эти документы написаны с использованием схемы MODS, с дополнительной локальной схемой, используемой в элементе расширения MODS. Что я хочу сделать, так это проверить эти документы на соответствие официальному MODS 3.7 xsd и локально написанному файлу schematron.sch.

Как проверить все элементы в пространстве имен MODS на соответствие mods-3.7.xsd и schematron.sch? Элементы в нашем локальном пространстве имен также должны быть проверены по schematron.sch.

Что мне нужно сделать в MarkLogic для правильной настройки проверки таким образом?

Я пытался переместить mods-3.7.xsd и schematron.sch в базу данных MarkLogic Schemas, а затем обновил xsi: schemaLocation в документах XML до xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-7.xsd http://www.loc.gov/mods/v3 /Schemas/schematron.sch", а затем протестировал проверку в консоли запросов MarkLogic с помощью xdmp:document-insert($new-uri, validate strict { $doc } ). Это просто возвращает ошибку: [1.0-ml] XDMP-VALIDATENODECL: (err: XQDY0084) validate strict {$ doc} - Объявление отсутствующего элемента: ожидаемое объявление для узла fn: doc ("/ Apps / theocom-maggie/scripts/MODS-conversion/ia-to-mods.xsl")/mods:mods в режиме non-lax с использованием схемы "" .

Помогите!

1 Ответ

1 голос
/ 08 ноября 2019

Имейте в виду, что URI схемы в schemaLocation разрешается в базе данных Schemas, а не в Интернете.

Если честно, я думаю, что в MarkLogic проще всего не использовать xsi:Атрибут schemaLocation, а точнее импортируйте схему явно в xqy (используя оператор import schema), чтобы убедиться, что она находит его правильно.

Кстати, Джошуа прав насчет Schematron. Оператор validate не выполняет проверку Schematron. Тем не менее, MarkLogic предоставляет поддержку схематрон, которую вы можете применить вручную:

https://docs.marklogic.com/schematron

Шаблон будет примерно следующим. Вы начинаете с загрузки schematron и схемы в базу данных схем. Затем вам нужно скомпилировать ваш файл схематрона, используя что-то вроде:

xquery version "1.0-ml";

import module namespace schematron = "http://marklogic.com/xdmp/schematron" 
      at "/MarkLogic/schematron/schematron.xqy";

schematron:put("/schematron.sch")

После этого вы используете схему импорта и проверку для выполнения проверки схемы и схемы. Что-то вроде:

import schema namespace mods = "http://www.loc.gov/mods/v3" at "/mods-3-6.xsd";

import module namespace schematron = "http://marklogic.com/xdmp/schematron" 
      at "/MarkLogic/schematron/schematron.xqy";

let $xml := <mods version="3.3" xmlns="http://www.loc.gov/mods/v3">

<titleInfo>
<title>FranUlmer.com -- Home Page</title>
</titleInfo>
<titleInfo type="alternative">
<title>Fran Ulmer, Democratic candidate for Governor, Alaska, 2002</title>
</titleInfo>
<name type="personal">
<namePart>Ulmer, Fran</namePart>
</name>
<genre>Website</genre>
<originInfo>
<dateCaptured point="start" encoding="iso8601">20020702 </dateCaptured>
<dateCaptured point="end" encoding="iso8601"> 20021203</dateCaptured>
</originInfo>
<language>
<languageTerm authority="iso639-2b">eng</languageTerm>
</language>
<physicalDescription>
<internetMediaType>text/html</internetMediaType>
<internetMediaType>image/jpg</internetMediaType>
</physicalDescription>
<abstract>Website promoting the candidacy of Fran Ulmer, Democratic candidate for Governor, Alaska, 2002. Includes candidate biography, issue position statements, campaign contact information, privacy policy and campaign news press releases. Site features enable visitors to sign up for campaign email list, volunteer, make campaign contributions and follow links to other internet locations. </abstract>
<subject>
<topic>Elections</topic>
<geographic>Alaska</geographic>
</subject>
<subject>
<topic>Governors</topic>
<geographic>Alaska</geographic>
<topic>Election</topic>
</subject>
<subject>
<topic>Democratic Party (AK)</topic>
</subject>
<relatedItem type="host">
<titleInfo>
<title>Election 2002 Web Archive</title>
</titleInfo>
<location>
<url>http://www.loc.gov/minerva/collect/elec2002/</url>
</location>
</relatedItem>
<location>
<url displayLabel="Active site (if available)">http://www.franulmer.com/</url>
</location>
<location>
<url displayLabel="Archived site">http://wayback-cgi1.alexa.com/e2002/*/http://www.franulmer.com/</url>
</location>
</mods>
return
  schematron:validate(
    validate strict { $xml},
    schematron:get("/schematron.sch")
  )

HTH!

...