2013-06-05 3 views
1

Есть моя проблема.Анализ XML с использованием документа(), который включает ссылки в XSLT

У меня есть файл XML с помощью ссылки и в том числе другой файл XML

XML-файл (разобран XSL):

<?xml version="1.0" encoding="utf-8"?> 
<!ENTITY % references SYSTEM "myref.ref"> 
<test> 
    <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="file2.XML"/> 
</test> 

file2.XML:

<?xml version="1.0" encoding="utf-8"?> 
<action>&testref;</action> 

myref.ref:

<!ENTITY testref 'cool ref there'> 

XSL:

<?xml version="1.0" encoding="iso-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <xsl:apply-templates select="//test"/> 
</xsl:template> 

<xsl:template match="test"> 
    <xsl:for-each select="document('file2.XML')//action"> 
    [...] 
</xsl:template> 

Тогда у меня есть XSL, которые используют функцию документа(), чтобы открыть file2.XML, который включает в себя ссылки (ссылки в myref.ref).

Таким образом, я получаю сообщение об ошибке: «Объект« refentity »ссылался, но не был объявлен, когда я использую документ (« file2.XML »).

Как мой myref.ref также будет использоваться, когда я открываю другой XML с помощью документа()?

Спасибо.

+0

Какой XSLT-процессор вы используете, и (что еще более важно), какой базовый анализатор XML вы используете? Недействительные синтаксические анализаторы, такие как expat, не могут анализировать внешние объекты, и даже при проверке парсеров такие функции иногда по умолчанию отключены по соображениям безопасности. –

+0

Я пробовал как с Xalan, так и с Saxon XSLT-процессором, и у меня такая же ошибка. Я не использую какой-либо основной синтаксический анализатор XML в процессе преобразования, проблема должна быть в XSL. Внешний XML-файл правильно читается. Если у меня нет ссылок на него, он работает нормально. – Rems

+0

Учтите, что вы делитесь своим XML-файлом и XSLT-файлом с нами. –

ответ

1

Файл, который вы описываете как «XML-файл (проанализированный XSL)», не является XML; это было бы XML, если объявление объекта было завернуто в объявление типа документа, но сейчас это не так. Если ваш процессор XSLT не жалуюсь, я предполагаю, что вы отдаете это не то, что вы показываете, а нечто большее, как

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE test [ 
<!ENTITY % references SYSTEM "myref.ref"> 
]> 
<test> 
    <xi:include 
    xmlns:xi="http://www.w3.org/2001/XInclude" 
    href="file2.XML"/> 
</test> 

XInclude specification указывает, что по умолчанию включены ресурсы обрабатываются, как если бы они имели MIME тип application/xml; он явно лишает производительность или неэффективность обработки DTD неограниченным. Если процессор XInclude выполняет обработку DTD на нем, я бы ожидал, что он будет использовать DTD цели XInclude, а не DTD вложенного XML-документа. То есть, я был бы удивлен, если бы какой-либо процессор XInclude действительно делал то, на что вы надеетесь, учитывая введенный ввод. Копия libxml в моей системе просто вызывает указанную вами ошибку, жалуясь, что объект testref не определен.

С другой стороны, я должен признать, что было бы трудно утверждать, что то, что вы хотите, явно несовместимо с спецификацией XInclude. В конце концов, спецификация явно говорит о том, что «особенности выполнения проверки DTD или XML-схемы ... не ограничены этой спецификацией». Учитывая это утверждение, было бы трудно утверждать, что спецификация XInclude требует, чтобы любая обработка DTD включенного ресурса выполнялась с использованием DTD включенного ресурса, а не DTD включенного ресурса. Обработка DTD не ограничена спецификацией XInclude; Я не вижу способа доказать, что неправильно использовать анализируемый ресурс, как если бы он был внешним объектом. Точно так же, конечно, xmllint явно входит в свои права как соответствующий процессор, когда он жалуется на необъявленный объект.

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

+0

Проблема не в функции XSLT document(), а на XInclude? – Rems

+0

Похож на вопрос XInclude для меня. –