Как проанализировать два тега XML на одном уровне, используя метод для каждого с помощью xslt? - PullRequest
0 голосов
/ 03 марта 2010

Я конвертирую xml используя xslt.

Оригинальный XML это

<Content>
  <book>
     <customData>
          <CustomDataElement>
             <title>book-name</title>
             <value>Java</value>
          </CustomDataElement>
          <CustomDataElement>
             <title>genre</title>
             <value>Programming</value>
          </CustomDataElement>
     </customData>
  </book>
  <authors>
    <author>
       <name>authorOne</name>
       <country>US</country>
    </author>
  </authors>
  <book>
     <customData>
          <CustomDataElement>
             <title>book-name</title>
             <value>Stranger</value>
          </CustomDataElement>
          <CustomDataElement>
             <title>genre</title>
             <value>Fiction</value>
          </CustomDataElement>
     </customData>
  </book>
  <authors>
    <author>
       <name>authorthree</name>
       <country>UK</country>
    </author>
  </authors>
</Content>

и мой xslt выглядит следующим образом

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:template match="/">
<xsl:for-each select="Content/book">
<media>
    <book>
<xsl:apply-templates select="customData/CustomDataElement[title = 'book-name']" />
    </book>

    <genre>
<xsl:apply-templates select="customData/CustomDataElement[title = 'genre']" />
    </genre>
    <author>
    <xsl:value-of select="../authors/author/name" />
    </author>
</media>
</xsl:for-each>
</xsl:template>

<xsl:template match="CustomDataElement">
<xsl:value-of select="value" />
</xsl:template>
</xsl:stylesheet>

Это дает мне вывод как

<?xml version="1.0"?>
<media>
   <book>Java</book>
   <genre>Programming</genre>
   <author>authorOne</author>
</media>
<media>
   <book>Stranger</book>
   <genre>Fiction</genre>
   <author>authorOne</author>
</media>

Мне нужно имя автора из тега «авторы \ автор», который следует за тегом книги.

что мне здесь не хватает? Пожалуйста, помогите

1 Ответ

2 голосов
/ 03 марта 2010

вместо

<xsl:value-of select="../authors/author/name" />

попробовать

<xsl:value-of select="following-sibling::authors[1]/author/name" />

Поскольку вы находитесь в контексте узла book, этот xpath говорит, что нужно искать первый ([1]) после узла authors после родного брата и выбирать из него author/name.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...