2013-02-09 2 views
0

Я нашел несколько Q, связанный с XInclude, но никто, что конкретно ответил на мой очень простой вопрос о том, как включить внешние документыпростого использование XInclude в XML-документах

Здесь пока пару XML документов, которые я хотел бы исх друг друга:

<?xml version="1.0" encoding="UTF-8"?> 
<t:person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://test test-schema.xsd" 
    xmlns:t="http://test"> 

    <t:first-name>Wilma</t:first-name> 
    <t:last-name>Flintstone</t:last-name> 
    <t:spouse> 
     <xi:include xmlns:xi="http://www.w3.org/TR/xinclude" href="fred.xml"/> 
    </t:spouse> 

    </t:person> 

<?xml version="1.0" encoding="UTF-8"?> 
<t:person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://test test-schema.xsd" 
xmlns:t="http://test"> 
    <t:first-name>Fred</t:first-name> 
    <t:last-name>Flintstone</t:last-name> 
    <t:spouse> 
     <xi:include xmlns:xi="http://www.w3.org/TR/xinclude" href="wilma.xml"/> 
    </t:spouse> 
</t:person> 

и схемы:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://test" 
    targetNamespace="http://test" elementFormDefault="qualified"> 

<xs:element name="person" type="personType"/> 


<xs:complexType name="personType"> 
    <xs:sequence> 
     <xs:element name="first-name" type="xs:string"/> 
     <xs:element name="last-name" type="xs:string"/> 
     <xs:element name="spouse" type="personType"/> 
    </xs:sequence> 
</xs:complexType> 

</xs:schema> 

кси: включают элемент придумывает как недействительные. Я искал вокруг и не могу найти простой пример. Xi: включить просто элемент ожидания для элемента, который должен быть там, правильно?

спасибо, п.о.

ответ

1

Кто-то, кто хочет выполнить как проверки и XInclude обработки, возможно, пожелает выполнить XInclude первый, а затем проверки или проверки, а затем выполнить XInclude или проверки, а затем выполнять обработку XInclude, затем повторите проверку. В текущем состоянии технологии чтения ума программное обеспечение не может определить, какая из них желательна без помощи человека. Вы знаете, в каком порядке вы хотите, чтобы вещи произошли, но вы сказали свое программное обеспечение? Из вашего описания звучит так, как будто ваш процессор по умолчанию выполняет проверку - сначала, затем XInclude; если вы хотите выполнить нестандартную последовательность обработки, вам придется рассказать о вашем процессоре. Как вы это делаете, зависит от процессора; прочитайте документацию.

1

У вас неправильное пространство имен для Xinclude.

Запуск xmllint --xinclude на любом из ваших xml-файлов не производит никаких изменений , поскольку он не распознается как оператор xinclude.

Изменение пространства имен: xmlns:xi="http://www.w3.org/2001/XInclude"

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

$xmllint --xinclude wilma.xml 
fred.xml:8: element include: XInclude error : detected a recursion in wilma.xml 
<?xml version="1.0" encoding="UTF-8"?> 
<t:person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:t="http://test" xsi:schemaLocation="http://test test-schema.xsd"> 
    <t:first-name>Wilma</t:first-name> 
    <t:last-name>Flintstone</t:last-name> 
    <t:spouse> 
     <t:person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:t="http://test" xsi:schemaLocation="http://test test-schema.xsd"> 
    <t:first-name>Fred</t:first-name> 
    <t:last-name>Flintstone</t:last-name> 
    <t:spouse> 
     <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="wilma.xml"/> 
    </t:spouse> 
</t:person> 
    </t:spouse> 
</t:person> 

XInclude должна рекурсивно обрабатывать xincludes , однако согласно http://www.w3.org/TR/xinclude/#loops:

При рекурсивной обработке элемента xi: include это является фатальной ошибкой для про cess другой элемент xi: include с включенным местоположением и значением атрибута xpointer, которые уже были обработаны в цепочке включения.

Кроме того, когда вы попробуйте проверить его на схеме, кроме ошибки рекурсии, вы получите:

fred.xml:4: element person: Schemas validity error : Element '{http://test}person': This element is not expected. Expected is ({http://test}first-name). 
wilma.xml fails to validate 

Я считаю, что это происходит потому, что ваша схема говорит, что супруга Isa personType, но в вашем xml, супруг СОДЕРЖИТ персонуType элемент: человек.

Плюс то, что сказал c-m-sperberg-mcqueen.

Если вы хотите, чтобы это было выполнено, прежде чем делать расширение xinclude, вам необходимо включить элемент xi: include и его атрибуты в схеме.

Если вы хотите, чтобы проверить после выполнения расширения XInclude, процессор XInclude будет (если не сказать это не каким-то образом), как правило, добавить XML: атрибут базы для включенного элемента, так что вам нужно будет добавить xml: base как разрешенный атрибут в схеме. (Первоначально я думал, что, поскольку пространство имен xml зарезервировано, этот xml: атрибуты не обязательно должны быть включены в схему, но это не тот случай.)

Смежные вопросы