Можете ли вы использовать ключ / keyref вместо ограничения / перечисления в схеме XML? - PullRequest
0 голосов
/ 22 сентября 2008

Предположим, у нас есть таблица стилей, которая извлекает метаданные с помощью функции key (). Другими словами, у нас есть экземпляры документов, подобные этому:

<items>

<item type="some_type"/>

<item type="another_type"/>

</items>

и таблица дополнительных данных, которые мы хотели бы связать с элементами во время обработки:

<item-meta>

<item type="some_type" meta="foo"/>

<item type="another_type" meta="bar"/>

<item type="yet_another_type" meta="baz"/>

</item-meta>

Наконец, предположим, что мы хотим выполнить проверку схемы в документе экземпляра, ограничив атрибуты типа набором типов, которые встречаются в item-meta. Поэтому в схеме мы хотим использовать ключ / keyref вместо ограничения / перечисления. Это связано с тем, что использование ограничения / перечисления потребует составления отдельного списка допустимых атрибутов типа.

Однако не похоже, что key / keyref действительно будет работать. Попробовав это (с MSXML 6.0), оказывается, что селектор ключа схемы не примет функцию document () в своем аргументе xpath, поэтому мы не можем проверить метаданные элемента, независимо от того, появляется ли он во внешнем файле или в самом файле схемы. Похоже, единственное место, где мы можем искать ключи - это экземпляр документа.

Так что, если мы действительно не хотим иметь отдельный список допустимых типов, мы должны выполнить преобразование перед проверкой, извлекая элемент мета-элемента, затем выполнить проверку, а затем выполнить наше исходное преобразование. Это кажется слишком сложным для того, что должно быть относительно простым использованием XML-схемы и таблиц стилей.

Есть ли лучший способ?

Ответы [ 3 ]

1 голос
/ 23 сентября 2008

Селекторы в key / keyref допускают только очень ограниченный синтаксис xpath. Коротко, но не совсем точно: селектор должен указывать на подузел объявленного элемента.

Полное определение ограниченного синтаксиса: -> здесь .

Итак, нет, я не вижу лучшего способа, извините.

Кстати: W3C заявляет, что это ограничение было сделано, чтобы облегчить жизнь разработчикам процессоров XML-схемы. Имейте в виду, что одна из целей разработки XML-схемы состояла в том, чтобы сделать возможным обработку документа в потоковом режиме. Это действительно объясняет многие из, казалось бы, случайных ограничений XML-схемы.

0 голосов
/ 23 сентября 2008

Вам не нужно останавливать XSLT с некоторой ошибкой. Просто дайте ему создать что-то, что схема не будет проверять, и это указывает на исходную проблему, такую ​​как

 <error txt="Invalid-Item-Type 'invalid_type'"/>

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

Помните, что философия здесь такова: «Один вопрос, и лучший ответ побеждает».

0 голосов
/ 23 сентября 2008

Подумав об этом немного больше, мне пришла в голову мысль о том, чтобы таблица стилей выполняла эту часть проверки. Схема определит тип элемента в виде простой строки, а таблица стилей выдаст сообщение и прекратит обработку, если не сможет найти тип элемента в таблице item-meta.

Это решение устраняет первоначальную проблему необходимости записывать список допустимых типов более одного раза, но оно вводит проблему, заключающуюся в том, что логика проверки теперь смешивается с логикой таблицы стилей. У меня недостаточно опыта работы с XSD + XSLT, чтобы определить, является ли эта новая проблема менее серьезной, чем старая, но она кажется более изящной, чем то, что я писал ранее о вставке таблицы метаэлементов в каждый документ экземпляра в пре-валидационное преобразование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...