【发布时间】:2014-01-27 15:04:23
【问题描述】:
更新包含一些额外的细微差别
我有一个需要一些复杂 XSLT 的 XML 场景。我一直在尝试自己解决这个问题,但到目前为止还没有成功。
首先,这是一个模拟 XML 结构。
<Author id="1234">
<reviews>poor</reviews>
<Media>
<MediaSet>
<MediaCode type="CD">474747</MediaCode>
</MediaSet>
<MediaSet>
<MediaCode type="CD">535353</MediaCode>
</MediaSet>
<MediaSet>
<MediaCode type="eBook">989898</MediaCode>
</MediaSet>
<MediaSet>
<MediaCode type="download">202020</MediaCode>
</MediaSet>
<MediaSet>
<MediaCode type="book">161616</MediaCode>
</MediaSet>
<MediaSet>
<MediaCode type="DVD">828282</MediaCode>
</MediaSet>
<MediaSet>
<OtherCode type="widget" number="747474"/> <!--note different element name and structure-->
</MediaSet>
</Media>
<name>JimBob</name>
</Author>
这个例子是我正在处理的一个非常简化的版本,但我想为数据库导入创建一个看起来像这样的输出:
<row>
<field name="authorID">1234</field>
<field name="reviews">poor</field>
<field name="CD">474747</field>
<field name="name">JimBob</field>
</row>
<row>
<field name="authorID">1234</field>
<field name="reviews">poor</field>
<field name="CD">535353</field>
<field name="name">JimBob</field>
</row>
<row>
<field name="authorID">1234</field>
<field name="reviews">poor</field>
<field name="eBook">989898</field>
<field name="name">JimBob</field>
</row>
<row>
<field name="authorID">1234</field>
<field name="reviews">poor</field>
<field name="download">989898</field>
<field name="name">JimBob</field>
</row>
<row>
<field name="authorID">1234</field>
<field name="reviews">poor</field>
<field name="widget">555555</field>
<field name="name">JimBob</field>
</row>
- CD、电子书、下载可以发生零次或多次。
- 我需要为每个实例创建一个单独的行
- 我想忽略某些元素(例如“书”、“DVD”等)。
- 有 100,000 名“作者”,每个人都有自己独特的“媒体代码”组合。
- 我需要从中提取数据的混合元素
我有代码将它从起始 XML 结构转换为行/字段 XML 结构,以便数据库导入工作正常,我正在处理的问题是遍历 XML 并在存在多个数据点时创建多行。
这是可以单独使用 XSLT 管理的,还是我必须使用另一种语言来处理?
值得注意的是,我正在处理的 XML 文件的结构要复杂得多,大约为 325MB。
【问题讨论】:
-
如果您已经“拥有将其从起始 XML 结构转换为行/字段 XML 结构的代码”,请在此处发布(一个 sn-p,如果它的整体太长)。
-
我已经“按原样”回答了您的问题。但是,恕我直言,在将结构导入数据库之前将其展平是错误的。假设是一个关系数据库,最好将数据导入两次,分别导入两个单独的表:Authors 和 Media,而不是一个包含大量重复重复相同数据的平面表。
-
另外,您应该有一个媒体类型字段,其中“CD”、“Ebook”等是值,另一个字段是媒体代码,通用于所有类型。否则搜索数据库会变得很麻烦。