Растущие выходные элементы из входных элементов с XSLT 1.0 - PullRequest
0 голосов
/ 26 апреля 2018

У меня небольшая проблема с XSLT при преобразовании xml в другой xml.Xml и xslt, с которыми я работаю, являются более сложными, и эта проблема является лишь ее частью.

Проблема

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

Мой инстинкт программирования заключался в том, чтобы найти версию XSLT 1.0 для создания двух списков и добавления правильных данных, но я не вижу, как это сделать.что в чистом XSLT 1.0.

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

Пример

У меня есть xml символьных элементов.Я хочу извлечь имена и кавычки из каждого символа и поместить имена в элемент «символ», а кавычки - в элемент «taglines».

Исходный XML:

<Cast>
    <Character>
        <name>The Cheat</name>
        <quote>Meh</quote>
    </Character>
    <Character>
        <name>Homsar</name>
        <quote>eey-y-yy</quote>
    </Character>
</Cast>

Выходной XML:

<Cast>
    <Character>
        <name>The Cheat</name>
        <name>Homsar</name>
    </Character>
    <taglines>
        <quote>Meh</quote>
        <quote>eey-y-yy</quote>
    </taglines>
</Cast>

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Попробуйте это:

<xsl:template match="Cast">
  <xsl:copy>
    <xsl:element name="Character">
      <xsl:apply-templates select="Character/name"/>
    </xsl:element>
    <xsl:element name="taglines">
      <xsl:apply-templates select="Character/quote"/>
    </xsl:element>
  </xsl:copy>
</xsl:template>


<!-- Identity -->
<xsl:template match="node()|@*">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
</xsl:template>
0 голосов
/ 26 апреля 2018

Я бы просто настроил скелет и xsl:copy-of все соответствующие элементы под их родителями:

<xsl:template match="Cast">
    <Cast>
        <Character>
            <xsl:copy-of select="//name"/>
        </Character>
        <taglines>
            <xsl:copy-of select="//quote"/>
        </taglines>
    </Cast>
</xsl:template>

Результирующий XML:

<Cast>
    <Character>
        <name>The Cheat</name>
        <name>Homsar</name>
    </Character>
    <taglines>
        <quote>Meh</quote>
        <quote>eey-y-yy</quote>
    </taglines>
</Cast>
0 голосов
/ 26 апреля 2018

С помощью XSLT-1.0 вы можете добиться этого с помощью следующих шаблонов:

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

    <xsl:template match="Cast">
      <xsl:copy>
        <Character>
            <xsl:apply-templates select="Character/name" />
        </Character>
        <taglines>
            <xsl:apply-templates select="Character/quote" />
        </taglines>
      </xsl:copy>
    </xsl:template>

    <xsl:template match="name">
      <name><xsl:value-of select="." /></name>
    </xsl:template>

    <xsl:template match="quote">
      <quote><xsl:value-of select="." /></quote>
    </xsl:template>    

</xsl:stylesheet>

Вывод:

<?xml version="1.0"?>
<Cast>
    <Character>
        <name>The Cheat</name>
        <name>Homsar</name>
    </Character>
    <taglines>
        <quote>Meh</quote>
        <quote>eey-y-yy</quote>
    </taglines>
</Cast>
...