Выполните сопоставление между атрибутом xml:base и другими значениями узла файла xml с помощью XSLT 1.0.

У меня есть XML-документ, как показано ниже,

<chapter xmlns:xi="http://www.w3.org/2001/XInclude" xml:id="chapter1">
<title>First chapter</title>
<section xml:id="section1">
                <imageobject>
                    <imagedata fileref="images/image1.jpg"/>
                </imageobject>
                <imageobject>
                    <imagedata fileref="images/image5.jpg"/>
                </imageobject>
</section>
    <chapter xmlns:xi="http://www.w3.org/2001/XInclude" xml:id="chapter2"   xml:base="../foder1/section2.xml">        
   <section xml:id="section2">
                    <imageobject>
                        <imagedata fileref="images/image2.jpg"/>
                    </imageobject>
                    <imageobject>
                        <imagedata fileref="images/image3.jpg"/>
                    </imageobject>
    </section>
    </chapter>
    <chapter xmlns:xi="http://www.w3.org/2001/XInclude" xml:id="chapter3" xml:base="../folder3/section3.xml">  
   <section xml:id="section3">
                    <imageobject>
                        <imagedata fileref="images/image4.jpg"/>
                    </imageobject>
    </section>
   </chapter>
 </chapter>

Как и в файле, в каждом включенном файле есть относительные пути к изображениям. Я хочу получить абсолютный путь к изображению. Для этого я собираюсь объединить значение xml:base каждой главы с относительными путями изображений в этой главе. Затем я могу получить все абсолютные пути к изображениям в каждой главе. Для этого я использовал следующий файл XSLT 1.o.

<xsl:template match="/">
<imagepaths>
<xsl:for-each select="chapter/chapter">
 <basepath>
 <xsl:value-of select="@xml:base"/>
 </basepath>
</xsl:for-each>
 <xsl:apply-templates select="*" /> 
</image-paths>
</xsl:template>

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

   <xsl:template match="imagedata">
  <relativepath>
  <xsl:value-of select="@fileref" />
  </realtivepath>
  </xsl:template>
  </xsl:stylesheet>

Но это дает все значения xml:base и относительные пути отдельно. Он не обеспечивает никакого сопоставления между значением xml:base каждой главы и относительными путями в этой главе. Я хочу иметь сопоставление между значением xml:base и всеми относительными путями в этой главе. Как я должен это отображение делать? Я думаю, что, имея вывод, как показано ниже, я могу выполнить сопоставление и получить абсолютный путь к изображениям. Пожалуйста, помогите мне получить следующий результат с моим XSLT. С его помощью я могу получить доступ ко всем изображениям в разделе 1 по «основному относительному пути» и изображениям раздела 2, раздела 3 по узлам базового пути и относительного пути.

<Imagedata>
    <mainrelativepath>images/image1.jpg</mainrelativepath>
    <mainrelativepath>images/image5.jpg</mainrelativepath>
<chapter>
    <basepath>../foder1/section2.xml</basepath>
    <relativepath>images/image2.jpg</relativepath>
    <relativepath>images/image3.jpg</relativepath>
</chapter>
<chapter>
    <basepath>../foder3/section3.xml</basepath>
    <relativepath>images/image4.jpg</relativepath>
</chapter>

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


person vish    schedule 21.07.2012    source источник


Ответы (1)


Это преобразование:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

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

 <xsl:template match="*/chapter">
  <chapter>
   <basepath><xsl:value-of select="@xml:base"/></basepath>
   <xsl:apply-templates/>
  </chapter>
 </xsl:template>

 <xsl:template match="imagedata">
   <relativepath><xsl:value-of select="@fileref"/></relativepath>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

при применении к предоставленному XML-документу:

<chapter xmlns:xi="http://www.w3.org/2001/XInclude" xml:id="chapter1">
    <title>First chapter</title>
    <section xml:id="section1">
                    <imageobject>
                        <imagedata fileref="images/image1.jpg"/>
                    </imageobject>
    </section>
        <chapter xmlns:xi="http://www.w3.org/2001/XInclude" xml:id="chapter2"   xml:base="../foder1/section2.xml">
       <section xml:id="section2">
                        <imageobject>
                            <imagedata fileref="images/image2.jpg"/>
                        </imageobject>
                        <imageobject>
                            <imagedata fileref="images/image3.jpg"/>
                        </imageobject>
        </section>
        </chapter>
        <chapter xmlns:xi="http://www.w3.org/2001/XInclude" xml:id="chapter3" xml:base="../folder3/section3.xml">
       <section xml:id="section3">
                        <imageobject>
                            <imagedata fileref="images/image4.jpg"/>
                        </imageobject>
        </section>
       </chapter>
</chapter>

выдает желаемый правильный результат:

<Imagedata>
   <chapter>
      <basepath>../foder1/section2.xml</basepath>
      <relativepath>images/image2.jpg</relativepath>
      <relativepath>images/image3.jpg</relativepath>
   </chapter>
   <chapter>
      <basepath>../folder3/section3.xml</basepath>
      <relativepath>images/image4.jpg</relativepath>
   </chapter>
</Imagedata>
person Dimitre Novatchev    schedule 21.07.2012
comment
Привет Димитре .. Большое спасибо за ваш быстрый ответ. Это то, что я искал. Но вы можете заметить, что в файле xInclude xml есть относительный путь, например images/image1.jpg. С вашим XSLT кажется, что мы упустили этот путь. Если вы можете изменить свой ответ, чтобы добавить этот путь к изображению. Извините, я не мог упомянуть об этом раньше. Я изменил новый вывод. Заранее спасибо.. - person vish; 21.07.2012
comment
@vish, я думаю, вы допустили структурную ошибку - первая глава включает в себя все остальные главы. Если это действительно так, то все изображения должны принадлежать первой главе, но это не отражается в предоставленном желаемом выводе. Следовательно, если изображения самой внешней главы также должны быть сгенерированы, то вопрос имеет заметный пробел, не объясняя, что считается изображением главы, а что нет. Пожалуйста, отредактируйте вопрос и предоставьте непротиворечивое объяснение и/или измените желаемый результат. - person Dimitre Novatchev; 22.07.2012
comment
Извините за опоздание. Я изменил ‹xsl:template match=/*› на ‹xsl:template match=/› и получил желаемый результат. Ты обалденный..!! Еще раз большое спасибо..=) - person vish; 22.07.2012
comment
Привет! С моим решением я смог получить только один путь к изображению в первой главе. Но как мне получить все пути, если во внешней главе их несколько? Я изменил желаемый результат. Если вы можете, пожалуйста, помогите мне создать этот вывод. Я хочу, чтобы пути к изображениям первой главы отличались от других путей к изображениям. Я думаю, что имея еще один узел, такой как mainrelativepath, я смогу выполнить свою задачу. - person vish; 22.07.2012
comment
@vish, Пожалуйста, задайте новый, отдельный вопрос. Люди ненавидят месяцами отвечать на следующую версию одного и того же вопроса. Читатели теряют огромное количество полезной информации, поскольку старая версия вопроса заменяется новой. - person Dimitre Novatchev; 22.07.2012
comment
Ааа... понял... задам новый вопрос. Спасибо..!! - person vish; 22.07.2012