Я хотел бы динамически генерировать атрибут Schematron see
на основе домашнего каталога пользователя. Я не мог заставить это работать. У вас есть идея, возможно ли это? Он должен работать в Oxygen XML. Я не уверен, что это технически невозможно в Schematron или это ошибка в Oxygen XML.
<?xml version = "1.0" encoding = "UTF-8"?>
<sch:schema xmlns:sch = "http://purl.oclc.org/dsdl/schematron" queryBinding = "xslt2"
xmlns:sqf = "http://www.schematron-quickfix.com/validator/process">
<sch:pattern>
<sch:rule context = "/">
<sch:let name = "x" value = "if (contains(base-uri(), 'myname'))
then 'http://www.a.com'
else 'http://www.b.com'"/>
<sch:report test = "'a' = 'a'">
Hello world: "<sch:value-of select = "$x"/>"
</sch:report>
</sch:rule>
</sch:pattern>
</sch:schema>
Моя цель — сгенерировать пользовательскую ссылку на локально развернутое руководство по стилю, но, как вы можете видеть на скриншоте, переменная x
не разрешена.
Вы можете протестировать любой XML-документ с помощью этого файла Schematron, потому что он соответствует корневому узлу и имеет фиктивное правило. Schematron — это диалект XSLT для проверки файлов, а не для их преобразования.
Похоже, вы пытаетесь использовать функцию проверки Schematron в Oxygen XML для запуска проверки Schematron в XML-документе, используя предоставленную вами схему Schematron. Это верно? Какой результат вы видите по сравнению с ожидаемым?
Привет @JoshuaLegler, я обновил описание и добавил скриншот с некоторыми дополнительными пояснениями.
Может быть, вы можете попробовать прочитать системное свойство «user.home»: https://www.saxonica.com/html/documentation12/functions/fn/system-property.html
Привет @radu-coravu, Oxygen вообще не разрешает переменные в see
.
Я посмотрел и могу подтвердить, что, кажется, мы не расширяем какой-либо тип ссылки на переменную или выражение xpath внутри атрибута @see. Я добавлю внутреннюю проблему для этого. Если бы это работало, синтаксис должен был бы выглядеть так, как упомянул Мартин Хоннен: «see = "{$x}"".
Спасибо, Раду. Я исправил это в своем вопросе и принимаю ваш ответ как лучший ответ.
Используя Schxslt, кажется, что синтаксис шаблона значения атрибута XSLT в форме, например. see = "{$x}"
в Schematron затем генерирует отчет SVRL с URI в форме, например.
<svrl:successful-report location = "/" see = "http://www.b.com" test = "'a' = 'a'">
<svrl:text>
Hello world
</svrl:text>
</svrl:successful-report>
Я не знаю, есть ли у oXygen какая-либо интеграция для Schxslt в качестве валидатора Schematron и для рендеринга результата проверки в виде SVRL.
Спасибо, Мартин. Раду подтвердил, что переменная не раскрывается в see
, и подал заявку.
Чтобы опираться на ответ @radu-coravu, вы можете получить значение «user.home», используя функцию во внешнем файле XSLT:
xsl:include
в файле Schematron, чтобы включить XSLT. См., например, https://github.com/AntennaHouse/focheck/blob/43bd5d491d8b985395c94c3c53083770d8c461b6/schematron/fo-property.sch#L23rule
в вашем Schematron используйте let
, чтобы получить возвращаемое значение функции как значение переменной. См., например, https://github.com/AntennaHouse/focheck/blob/43bd5d491d8b985395c94c3c53083770d8c461b6/schematron/fo-property.sch#L31assert
и report
так же, как и любую другую переменную.Привет, Тони, это можно сделать без включения других таблиц стилей. Это тоже работает, но не решает мою проблему с атрибутом see
. <sch:report test = "'a' = 'a'" see = "{$x}"><sch:value-of select = "system-property('user.home')"/></sch:report>
Я обновил свой вопрос.
Где код XSLT, который вы пытаетесь реализовать? Что у вас есть на входе? Каков соответствующий результат, который вы хотите получить, и что вы получили вместо этого?