Скопируйте изображения документа xml из разных исходных папок в один выходной каталог

У меня есть документ XML с использованием xinclude для доступа к нескольким другим файлам XML.

<chapter xml:id="chapter1">
<title>Chapter in Main Doc</title>
<section xml:id="section">
    <title>Section in Main Doc 1</title>
            <mediaobject>
                <imageobject>
                    <imagedata fileref="images/car.jpg"/>
                </imageobject>
            </mediaobject>
</section>
<xi:include href="../some-doc/section1.xml"/>
<xi:include href="../some-doc/section2.xml"/>

Эти другие XML-файлы section1 и section2 используют разные изображения в разных местах источника. Мне нужно скопировать все эти изображения в один выходной каталог. Поэтому сначала я планирую использовать XSLT для разбора целых XML-документов и создания списка изображений для копирования. Как я могу сгенерировать этот список изображений файлов XML с помощью XSLT? Ваши идеи действительно ценятся.

Заранее спасибо..!!

Добавлено:

Я попробовал с ниже ответил XSLT 1.0 код. Когда я генерирую вывод html, используя его, он отображает только идентификаторы глав и разделов, такие как "chapter1, section ...". Он не отображает значение пути изображения внутри узла imagedata.

Но когда я изменился <xsl:template match="@*|node()"> как <xsl:template match="*"> затем он также отображает все значения путей к изображениям xincluded xml-файлов. Но есть и другие значения узла, как и выше. Мне нужно отфильтровать все значения, кроме путей к изображениям.

Здесь мне нужно скопировать только пути к изображениям всех XML-документов и сохранить все эти пути в массиве или что-то в этом роде. Затем я могу использовать эти пути сохраненных изображений для копирования изображений с помощью класса Java.

1 ответ

Решение

Это не полное решение, но может быть достаточно для ваших нужд. Следующая таблица стилей XSLT 2.0 копирует документ, расширяя XInclude (с оговорками, отмеченными ниже).

<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xi="http://www.w3.org/2001/XInclude"
  xmlns:fn="http://www.w3.org/2005/xpath-functions"
  exclude-result-prefixes='xsl xi fn'>
<xsl:output method="xml" indent="yes"/>

<xsl:template match="@*|node()">
 <xsl:copy>
  <xsl:apply-templates select="@*|node()"/>
 </xsl:copy>
</xsl:template>

<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>

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

<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>

<xsl:template match="xi:include" />

</xsl:stylesheet> 

Предостережения

Это решение не реализует атрибуты: xpointer, accept и accept-language.

Искалеченный вариант XSLT 1.0

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xi="http://www.w3.org/2001/XInclude"
  exclude-result-prefixes='xsl xi'>
<xsl:output method="xml" indent="yes"/>

<xsl:template match="@*|node()">
 <xsl:copy>
  <xsl:apply-templates select="@*|node()"/>
 </xsl:copy>
</xsl:template>

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

<xsl:template match="xi:include" />

</xsl:stylesheet> 
Другие вопросы по тегам