Как применить XSLT к XML с помощью только XInclude

У меня есть этот файл XML:

<?xml version="1.0"?>
<xi:include href="http://www.w3schools.com/dom/books.xml" 
            xmlns:xi="http://www.w3.org/2003/XInclude"/>

и я ожидал, что это должно привести к указанному удаленному файлу XML http://www.w3schools.com/dom/books.xml во время обработки.

Для этого я создал этот XSL-файл:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:output method="xml"/>
    <xsl:template match="*">
        <xsl:copy-of select="//book/title"/>
    </xsl:template>
</xsl:stylesheet>

который после XSL-преобразования я ожидал получить XML-вывод с заголовочными узлами из ссылочного XML-файла.

Однако этого не произошло, преобразование просто породило пустой файл. Я подозреваю что XInclude Инструкция не была выполнена.

Итак, как я могу применить XSLT к файлу Xincluded XML, если это возможно?

2 ответа

Решение

В комментариях ОП попросил просмотреть мой ссылочный ответ в Скопировать изображения документа xml из разных исходных расположений в один выходной каталог, так что вот оно.

Этот шаблон..

<xsl:template match="xi:include[@href][@parse='xml' or not(@parse)][fn:unparsed-text-available(@href)]">
 <xsl:apply-templates select="fn:document(@href)" />
</xsl:template>

... соответствует элементам xi:include, отвечающим всем этим требованиям:

  1. Имеет атрибут href
  2. Это относится к документу XML (в отличие от текстового документа)
  3. И этот документ можно найти и открыть.

Когда эти условия будут выполнены, откройте XML-документ и обработайте его, как если бы он был здесь, вместо узла xi:include.

Этот шаблон...

<xsl:template match="xi:include[@href][@parse='text'][fn:unparsed-text-available(@href)]">
 <xsl:apply-templates select="fn:unparsed-text(@href,@encoding)" />
</xsl:template>

... делает подобное для чистого текста Обратите внимание, что значением по умолчанию для @parse является "xml". Обратите внимание, мы можем даже изменить кодировку символов. Наш основной документ может быть в UTF-8, но включенный документ может быть, например, UTF-16LE.

И наконец этот шаблон...

<xsl:template match="xi:include[@href][@parse=('text','xml') or not(@parse)][not(fn:unparsed-text-available(@href))][xi:fallback]">
 <xsl:apply-templates select="xi:fallback/text()" />
</xsl:template>

... обрабатывает случаи, когда мы можем открыть документ (возможно, ссылка на файл не работает), а узел xi:include дает нам некоторый запасной контент.

Обработка XInclude, например проверка XSD, происходит, если вы запрашиваете ее, а не иначе. То, как вы его запрашиваете, зависит от среды, в которой вы находитесь. Например, у синтаксического анализатора Xerces есть опции для обработки XInclude.

Другие вопросы по тегам