通过XSL / XSLT进行XML到XML的转换?

时间:2011-08-16 18:16:08

标签: xml xslt solr

我正在努力尝试获取一个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 个答案:

答案 0 :(得分:2)

这里应该有所帮助。它相当简单,并假设您正在跳过任何嵌套表...而只是抓取其中的原子。它不会按任何特定顺序对字段进行排序。

<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>

答案 1 :(得分:0)

除非你能保证XML始终有效,否则我会采用编程语言方法。我为您解析数据提供了更多的灵活性。您声明数据来自专有数据库,这使我想要灵活性。

例如,如果数据库由于缺陷导出无效的xml,该怎么办?你能早点改变什么组件?

为什么不选择解析XML的解决方案,然后创建一个可以输出到所需格式的对象模型。您可以使用自己的XML / XSLT或模板工具集(POJO / Velocity)来处理最终转换。