Сортируйте два разных XML-элемента вместе и отображайте их - PullRequest
2 голосов
/ 12 августа 2011

Я получил XML-документ с несколькими значениями, это его часть:

<result>
  <element>
    <title>Title 1</title>
    <alternative>
      <alternativeTitle>Title 5<alternativeTitle>
    </alternative>
    <data>
      ...
    </data>
  </element>

  <element>
    <title>Title 3</title>
    <alternative>
      <alternativeTitle>Title 2<alternativeTitle>
      <alternativeTitle>Title 4<alternativeTitle>
    </alternative>
    <data>
      ...
    </data>
  </element>
</result>

Я пытаюсь отсортировать каждый заголовок, включая альтернативные заголовки.Это означает, что два вышеперечисленных элемента будут производить пять элементов, которые должны быть отсортированы (результатом должен быть заголовок 1, заголовок 2, заголовок 3, заголовок 4, заголовок 5).Также важно, чтобы данные были доступны после сортировки, чтобы можно было составить список и представить некоторые данные.Любые идеи о том, как это сделать?

Заранее, я хотел бы поблагодарить вас за вашу помощь!

РЕДАКТИРОВАТЬ: Извините, что не указал желаемый результат ввремя создания этого вопроса.Структура представляет собой набор статей (title-element - название статьи и т. Д.), Я хочу представить их в списке, который отсортирован.Может показаться нелогичным сортировать заголовки и альтернативные заголовки, но это имеет свою цель.:)

Используя XSL, мы создаем XHTML, который будет отображаться пользователю.Это будет выглядеть примерно так:

TITLE 1 (which is also a link to the full article)
some data from title 1
TITLE 2 (which is also a link to the full article)
some data from title 2
TITLE 3 (which is also a link to the full article)
some data from title 3

и т. Д.

Таким образом, статьи перечислены несколько раз, но с разными названиями.Я надеюсь, что это проясняет ситуацию, и еще раз спасибо за усилия до сих пор!В данный момент я не могу попробовать ответ Саймона, но думаю, что смогу настроить его, чтобы получить желаемый результат?

1 Ответ

0 голосов
/ 12 августа 2011

Я немного исправил / дополнил ваш XML до следующего:

<?xml version="1.0" encoding="UTF-8"?>

<result>
  <element>
    <title>Title 1</title>
    <alternative>
      <alternativeTitle>Title 5</alternativeTitle>
    </alternative>
    <data>
      <foo>123</foo>
    </data>
  </element>
  <element>
    <title>Title 3</title>
    <alternative>
      <alternativeTitle>Title 2</alternativeTitle>
      <alternativeTitle>Title 4</alternativeTitle>
    </alternative>
    <data>
        <baz>321</baz>
    </data>
  </element>
</result>

Было бы более полезно, если бы вы предоставили пример вывода, на который вы надеялись, но ядумаю, что следующее должно делать то, что вы просите:

<?xml version="1.0" encoding="UTF-8"?>

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

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

    <xsl:template match="result">
        <entries>
            <xsl:apply-templates select="element/title|element/alternative/alternativeTitle">
                <xsl:sort select="string(.)" />
            </xsl:apply-templates>
        </entries>
    </xsl:template>

    <xsl:template match="title">
        <entry>
            <xsl:copy-of select="." />
            <xsl:copy-of select="../data" />
        </entry>
    </xsl:template>

    <xsl:template match="alternative/alternativeTitle">
        <entry>
            <title><xsl:value-of select="(.)" /></title>
            <xsl:copy-of select="../../data" />
        </entry>
    </xsl:template>
</xsl:stylesheet>

Это приводит к выводу (с учетом измененного образца):

<?xml version="1.0"?> 
<entries> 
  <entry> 
    <title>Title 1</title> 
    <data> 
      <foo>123</foo> 
    </data> 
  </entry> 
  <entry> 
    <title>Title 2</title> 
    <data> 
        <baz>321</baz> 
    </data> 
  </entry> 
  <entry> 
    <title>Title 3</title> 
    <data> 
        <baz>321</baz> 
    </data> 
  </entry> 
  <entry> 
    <title>Title 4</title> 
    <data> 
        <baz>321</baz> 
    </data> 
  </entry> 
  <entry> 
    <title>Title 5</title> 
    <data> 
      <foo>123</foo> 
    </data> 
  </entry> 
</entries>
...