Учитывая следующий пример XML-файла:

<?xml version="1.0"?>
        <catalog>
           <book id="bk101">
              <author>Gambardella, Matthew</author>
              <title>XML Developer's Guide</title>
              <genre>Computer</genre>
              <price>44.95</price>
              <publish_date>2000-10-01</publish_date>
              <description>An in-depth look at creating applications 
              with XML.</description>
           </book>
           <book id="bk102">
              <author>Ralls, Kim</author>
              <title>Midnight Rain</title>
              <genre>Fantasy</genre>
              <price>5.95</price>
              <publish_date>2000-12-16</publish_date>
              <description>A former architect battles corporate zombies, 
              an evil sorceress, and her own childhood to become queen 
              of the world.</description>
           </book>
           <book id="bk103">
              <title>Maeve Ascendant</title>
              <genre>Fantasy</genre>
              <price>5.95</price>
              <publish_date>2000-11-17</publish_date>
              <description>After the collapse of a nanotechnology 
              society in England, the young survivors lay the 
              foundation for a new society.</description>
           </book>
        </catalog>

Мне нужно объединить все элементы заголовка в элемент автора по правилу: если элемент автора уже существует, то значение элемента заголовка будет вставлено в запись автора с использованием разделителя, т.е. персонаж. Если в записи нет элемента автора, элемент заголовка станет элементом автора. Желаемый результат:

 <?xml version="1.0"?>
        <catalog>
           <book id="bk101">
              <author>Gambardella, Matthew | XML Developer's Guide</author>
              <genre>Computer</genre>
              <price>44.95</price>
              <publish_date>2000-10-01</publish_date>
              <description>An in-depth look at creating applications 
              with XML.</description>
           </book>
           <book id="bk102">
              <author>Ralls, Kim | Midnight Rain</author>
              <genre>Fantasy</genre>
              <price>5.95</price>
              <publish_date>2000-12-16</publish_date>
              <description>A former architect battles corporate zombies, 
              an evil sorceress, and her own childhood to become queen 
              of the world.</description>
           </book>
           <book id="bk103">
              <author>Maeve Ascendant</author>
              <genre>Fantasy</genre>
              <price>5.95</price>
              <publish_date>2000-11-17</publish_date>
              <description>After the collapse of a nanotechnology 
              society in England, the young survivors lay the 
              foundation for a new society.</description>
           </book>
        </catalog>

Как достичь указанного выше результата с помощью xslt-3?

-2
user9413573 26 Фев 2018 в 16:34

1 ответ

Лучший ответ

Я бы удалил существующий элемент author и заменил элемент title новым элементом author.

Значение нового элемента author будет представлять собой строковое соединение исходного author (если оно существует) и текущего значения title, разделенных |.

Пример...

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="author"/>

  <xsl:template match="title">
    <author>
      <xsl:value-of select="string-join((../author,.),' | ')"/>
    </author>
  </xsl:template>

</xsl:stylesheet>

Примечание. Это также будет работать как XSLT 2.0, если вы замените xsl:mode на преобразование идентичности . .

1
Daniel Haley 27 Фев 2018 в 01:18