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

3

我正在努力尝试将专有数据库输出的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

这里有些东西可以帮助你。它相对简单,假设你跳过任何嵌套表格...只获取其中的原子。它不会按特定顺序排序字段。

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


正是我所需要的!天才! - mmundiff

0

除非您能保证XML始终有效,否则我建议选择编程语言方法。这样可以更灵活地解析数据。您提到的数据来自一个专有数据库,这使我想要灵活性。

举个例子,如果数据库由于一个缺陷而导出无效的xml。哪个组件会更快被更改?

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


通过其他方式(例如Java对象)将XML转换为XML会极大地增加解决方案的复杂性。与XSLT解决方案的11行相比,它很可能有几百行代码。而且,在XSLT解决方案中没有任何假设模式有效性的内容。 - Michael Kay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接