2008-09-22 5 views
0

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

<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. Поэтому в схеме мы хотим использовать key/keyref вместо ограничения/перечисления. Это связано с тем, что использование ограничения/перечисления потребует создания отдельного списка допустимых атрибутов типа.

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

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

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

ответ

1

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

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

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

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

0

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

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

0

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

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

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

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