2012-07-16 3 views
0

У меня есть документ xml, в котором xinclude другие файлы xml. Все эти xml-файлы содержат относительные пути для изображений, которые находятся в разных источниках.Создать список путей изображения в документах XML

<chapter xml:id="chapter1"> 
    <title>First chapter in Main Document</title> 
    <section xml:id="section1"> 
     <title>Section 1 in Main Document</title> 
     <para>this is paragraph<figure> 
       <title>Car images</title> 
       <mediaobject> 
        <imageobject> 
         <imagedata fileref="images/image1.jpg"/> 
        </imageobject> 
       </mediaobject> 
      </figure></para> 
    </section> 
    <xi:include href="../doc/section2.xml"/> 
    <xi:include href="../doc/section3.xml"/> 
</chapter> 

Здесь будут представлены документы раздела2 и section3 xml.

<section xml:id="section2" 
     <title>Main Documentation Section2</title> 
     <para>This is also paragraph <figure> 
       <title>Different Images</title> 
       <mediaobject> 
        <imageobject> 
         <imagedata fileref="images/image2.jpg"/> 
        </imageobject> 
       </mediaobject> 
      </figure></para> 
    </section> 

Я хочу создать таблицу стилей XSLT 1.0, которая будет генерировать список путей изображения во всех xml-документах. Я собираюсь скопировать те изображения, которые находятся в разных источниках, в папку с одним изображением. Затем я смогу использовать этот список путей изображения для копирования этих изображений. И было бы замечательно, если бы этот список путей изображений сохранялся в структуре, которая может получить доступ по классу java.

В настоящее время я использую XSLT, который я получаю от другого вопроса. Но этот XSLT дает другие значения узла вместе с путями изображений. Я попробовал много фильтровать их, изменяя значения шаблона.

<xsl:template match="*"> 
<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> 

Ожидаемый список результатов будет какая-то вещь, как,

/home/vish/test/images/image1.jpg

/дома/виш/тест/док/другие/изображения/image2 .jpg

/home/vish/test2/other/images/image3.jpg

Спасибо заранее .. !!

+0

Где делает "/ дома/виш/тест" часть взялось? –

+0

Я думал добавить xml: base для добавления этого общего пути и без абсолютного пути, я не смогу копировать изображения в выходной каталог, используя относительные пути в XML-документах. Но я не уверен. – vish

+0

Функция document() должна иметь возможность одинаково хорошо разрешать как абсолютные ссылки, так и относительные ссылки. –

ответ

2

Как насчет ...

<?xml version="1.0" encoding="utf-8"?> 
<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:strip-space elements="*" /> 

<xsl:template match="/"> 
<image-paths> 
    <xsl:apply-templates select="*" /> 
</image-paths> 
</xsl:template> 

<xsl:template match="*"> 
<xsl:apply-templates select="*" /> 
</xsl:template> 

<xsl:template match="imagedata"> 
<imagedata fileref="{@fileref}" /> 
</xsl:template> 

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

</xsl:stylesheet> 

Вы должны получить выход как ...

<image-paths> 
<imagedata fileref="path1/image1.jpg" /> 
<imagedata fileref="path2/image2.jpg" /> 
<imagedata fileref="path3/image3.jpg" /> 
</image-paths>