将带有xslt的分隔符的文本文件转换为xml

时间:2016-06-03 09:04:40

标签: xml xslt transformation

我正在寻找合适的工具将文本文件转换为xml。

文本文件如下所示:

2017-01-03-10.11.1201000B  H4_01DE33411121...
2017-01-01-09.12.1301000BHAX4_01DE34256137...
2017-01-01-10.12.1301000BMLH4_01DE63789221...

每一行都是实体的内容,我有以下信息:

Letter 0-18: Attribute1
Letter 19-21: Attribute2
Letter 22-23: Attribute3
Letter 24: Attribute4
Letter 25-31: Attribute5
and so on....

依旧......

现在我正在寻找一种工具,可以将此文本文件沿着此规则转换为以下xml

<entities>
    <entity>
        <attribute1>2017-01-03-10.11.12</attribute1>
        <attribute2>010</attribute2>
        <attribute3>00</attribute3>
        <attribute4>B</attribute4>
        <attribute5>H4_01</attribute5>
        ... and so on
    </entity>
    <entity>
        <attribute1>2017-01-01-09.12.13</attribute1>
        <attribute2>010</attribute2>
        <attribute3>00</attribute3>
        <attribute4>B</attribute4>
        <attribute5>HAX4_01</attribute5>
        ... and so on
    </entity>
   <entity>
        <attribute1>2017-01-01-10.12.13</attribute1>
        <attribute2>010</attribute2>
        <attribute3>00</attribute3>
        <attribute4>B</attribute4>
        <attribute5>MLH4_01</attribute5>
        ... and so on
    </entity>
</entities>

该工具还需要实现一些简单的逻辑,例如修剪字符串,if / else,日期格式转换。

首先,我考虑使用xslt - 所以这个奇怪的文本文件的所有者甚至可以自己生成相应的配置文件(这将是最好的!)。但我经常读到xslt仅用于将xml转换为其他格式,而不是将纯文本文件转换为xml。

它也应该是可维护的,因此使用awk和sed的shell脚本会非常混乱。

你知道一个比xslt更合适的工具吗?

此致 六甲

1 个答案:

答案 0 :(得分:1)

这样做的一种聪明方法是从描述输入的数据描述文件生成XSLT样式表。

如果数据描述文件有

<fields>
  <field name="attribute1" start="1" length="18"/>
  <field name="attribute2" start="19" length="2"/>
</fields>

然后很容易生成XSLT 3.0转换

<xsl:template name="main">
  <entities>
    <xsl:for-each select="unparsed-text-lines('input.xml')">
      <entity>
        <attribute1>{substring(., 1, 18)}</attribute1>
        <attribute2>{substring(., 1, 18)}</attribute2>
      </entity>
    </xsl:for-each>
  </entities>
</xsl:template>

(并且生成XSLT 2.0只是稍微复杂一点,但是做XSLT 1.0会更难,因为你无法直接读取纯文本文件。)

实施您的&#34;简单逻辑&#34;有点棘手,但在数据描述中添加额外的字段并不困难:

<field name="attribute1" start="1" length="18" action="checkDate"/>

导致生成的XSLT

<attribute1>{f:checkDate(substring(., 1, 18))}</attribute1>

在样式表中调用函数,例如

<xsl:function name="f:checkDate" as="xs:string">
  <xsl:param name="in" as="xs:string"/>
  <xsl:sequence select="if ($in castable as xs:date) then $in else error(...)"/>
</xsl:function>