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> 

도구는 간단한 논리를 구현해야합니다 (예 : 문자열 다듬기, if/else, 날짜 형식 변환).

처음에는 xslt를 사용하려고 생각했습니다. 그래서이 이상한 텍스트 파일의 소유자가 자신의 설정 파일을 생성 할 수있었습니다 (최선이었을 것입니다!). 하지만 저는 종종 xslt가 xml을 다른 형식으로 변환하기위한 것이지 일반 텍스트 파일을 xml로 변환하는 것이 아니라는 것을 자주 읽습니다.

또한 awk와 sed를 사용하는 쉘 스크립트가 매우 혼란 스럽기 때문에 유지 보수가 가능해야합니다.

xslt보다 적합한 도구를 알고 계십니까?

감사

+1

XSLT 2.0 및 3.0로 스타일 시트의 함수를 호출 'tokenize','substring' 및/또는'xsl : analyze-string'을 사용하여 문자열을 부분으로 분리하여 XSLT 2.0 또는 3.0이 확실히 적합한 도구가되도록하십시오. –

답변

1

로코 이렇게 현명한 방법은 입력 데이터를 설명하는 설명 파일로부터 XSLT 스타일 시트를 생성한다. 데이터 설명 파일이

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

이있는 경우

는 다음 (그리고

<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 3.0 변환을 생성하기 위해 꽤 쉽게 XSLT 2.0 아주 약간 더 복잡한 아니라 생성하지만, 일을 일반 텍스트 파일을 직접 읽을 수 없으므로 XSLT 1.0이 더 어렵습니다. 당신의 "간단한 논리"를 구현

는 조금 복잡합니다,하지만 데이터 설명을 추가 필드를 추가 할 어렵지 않을 것입니다 : 생성 된 XSLT가 발생

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

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

UNPA`로 텍스트 파일을 읽을 수 등

<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가 실제로 올바른 도구라는 것을 당신은 확신했습니다! 나는 당신이 묘사 한대로 이것을 할 것입니다! –

관련 문제