Преобразование XML в XML через XSL / XSLT? - PullRequest
3 голосов
/ 16 августа 2011

Я очень стараюсь, но мне не повезло взять XML-документ, который выплеван из собственной базы данных, и преобразовать его в правильно сформированный XML-документ, который в конечном итоге будет проиндексирован Apache Solr.

Я хотел бы взять этот XML-файл и преобразовать его в формат Apache Solr, как показано ниже.

<?xml version="1.0" encoding="UTF-8" ?>
<ecatalogue>
  <tuple>
    <table name="CatObjectName_tab">
      <tuple>
        <atom name="CatObjectName">Clog</atom>
      </tuple>
    </table>
    <atom name="CatObjectNumber">2003-39-27A</atom>
    <atom name="CatObjectTitle"></atom>
    <table name="CatOtherNumbers_tab">
      <tuple>
        <atom name="CatOtherNumbers">1895.1.117a</atom>
      </tuple>
    </table>
    <table name="ProPlaceName_tab">
      <tuple>
        <atom name="ProPlaceName">China</atom>
      </tuple>
    </table>
    <table name="CatOtherNumberType_tab">
      <tuple>
        <atom name="CatOtherNumberType">Other Number</atom>
      </tuple>
    </table>
    <atom name="DatDateMade"></atom>
    <atom name="DatEarliestDateMadeOrig"></atom>
    <atom name="DatLatestDateMadeOrig"></atom>
  </tuple>

  <tuple>
    <table name="CatObjectName_tab">
      <tuple>
        <atom name="CatObjectName">Boot</atom>
      </tuple>
    </table>
    <atom name="CatObjectNumber">2003-39-20B</atom>
    <atom name="CatObjectTitle"></atom>
    <table name="CatOtherNumbers_tab">
      <tuple>
        <atom name="CatOtherNumbers">1895.1.91b</atom>
      </tuple>
    </table>
    <table name="ProPlaceName_tab">
      <tuple>
        <atom name="ProPlaceName">China</atom>
      </tuple>
    </table>
    <table name="CatOtherNumberType_tab">
      <tuple>
        <atom name="CatOtherNumberType">Other Number</atom>
      </tuple>
    </table>
    <atom name="DatDateMade"></atom>
    <atom name="DatEarliestDateMadeOrig"></atom>
    <atom name="DatLatestDateMadeOrig"></atom>
  </tuple>
</ecatalogue>

Я хотел бы преобразовать вышеупомянутое в это:

<add>
    <doc>

        <field name="ProPlaceName">China</field>
        <field name="CatObjectTitle"></field>
        <field name="CatObjectNumber">2003-39-27A</field>
        <field name="CatOtherNumberType">Other Number</field>
        <field name="CatOtherNumbers">1895.1.117a</field>
        <field name="CatObjectName_tab">Clog</field>
        <field name="DatDateMade"></field>
        <field name="DatEarliestDateMadeOrig"></field>
        <field name="DatLatestDateMadeOrig"></field>
    </doc>
  <!-- Row 2 -->
    <doc>
        <field name="ProPlaceName">China</field>
        <field name="CatObjectTitle"></field>
        <field name="CatObjectNumber">2003-39-20B</field>
        <field name="CatOtherNumberType">Other Number</field>
        <field name="CatOtherNumbers">1895.1.91b</field>
        <field name="CatObjectName_tab">Boot</field>
        <field name="DatDateMade"></field>
        <field name="DatEarliestDateMadeOrig"></field>
        <field name="DatLatestDateMadeOrig"></field>
    </doc>
</add>

Лучше ли попробовать использовать XSL / XSLT или использовать что-то вроде java или другого языка программирования для преобразования? Как бы вы подошли к этой проблеме и могли бы вы указать мне правильное направление?

Я полагаю, что это можно сделать с помощью XSL. Любая помощь приветствуется.

Ответы [ 2 ]

2 голосов
/ 16 августа 2011

Вот кое-что, что должно помочь.Это довольно просто и предполагает, что вы пропускаете любые вложенные таблицы ... вместо этого только захватывая атомы внутри них.Он не сортирует поля в каком-либо определенном порядке.

<xsl:template match="/">
    <add>
        <xsl:for-each select="ecatalogue/tuple">
            <doc>
                <xsl:for-each select=".//atom">
                    <field name="{@name}"><xsl:value-of select="."/></field>
                </xsl:for-each>
            </doc>
        </xsl:for-each>
    </add>
</xsl:template>

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

Если вы не можете гарантировать, что XML всегда будет действительным, я бы выбрал подход на языке программирования. Я даю вам больше гибкости при разборе ваших данных. Вы заявили, что данные поступили из проприетарной базы данных , и поэтому мне нужна гибкость.

Например, что если база данных экспортирует недопустимый XML-файл из-за дефекта. Какой компонент вы могли бы изменить раньше?

Почему бы не выбрать решение, которое анализирует XML, а затем создает объектную модель, которая может быть выведена в желаемый формат. Вы можете использовать свой собственный XML / XSLT или набор инструментов для шаблонов (POJO / Velocity) для обработки окончательного преобразования.

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