2016-06-03 2 views
0

Я ищу подходящий инструмент для преобразования текстовых файлов в xml.Преобразование текстового файла без разделителя с xslt в 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> 

Инструмент также нуждается в реализации некоторой простой логики, например, обрезки строк, если/else, преобразование формата даты.

Во-первых, я подумал об использовании xslt - поэтому владелец этого странного текстового файла мог создать соответствующий файл конфигурации даже сам по себе (это было бы лучше!). Но я часто читал, что xslt предназначен только для преобразования xml в другие форматы, а не для преобразования текстовых файлов в xml.

Он также должен быть обслуживаемым, поэтому сценарий оболочки с использованием awk и sed будет очень запутанным.

Знаете ли вы инструмент, который более подходит, чем xslt?

С уважением, Рокко

+1

XSLT 2.0 и 3.0 можно прочитать в текстовых файлах с 'ПАООНОМ rsed-text ('file.txt') ', а затем используйте' tokenize', 'substring' и/или' xsl: analysis-string' для разбиения строк на части, поэтому XSLT 2.0 или 3.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 сложнее, потому что вы не можете читать простой текстовый файл напрямую).

Реализация вашей «простой логики» немного сложнее, но это не было бы трудно добавить дополнительное поле для описания данных:

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

Спасибо! Вы убедили меня, что XSLT - действительно правильный инструмент! Я сделаю это, как вы описали! –

Смежные вопросы