2014-02-15 2 views
2

'|'로 구분 된 non-xml 텍스트 파일을 전송하고 싶습니다. 문자를 Datapower를 사용하여 xml로 변환합니다.datapower를 사용하여 xml로 텍스트 파일 변환

Following is file (sample1) 

10 | 20003 | 24/23/25 | 23,890

지금 나는이었다 무슨 짓을 다음과 같은 XML

<ResponseType> 
     <ResCode>10</ResCode> 
     <Id>20003</Id> 
     <SoftCode>24/23/25</SoftCode> 
     <StatusCode>23890</StatusCode> 
    </ResponseType> 

에이 휴식 할 following--

1> 비 XML 요청을받을 서비스에서 변형 동작을 만듭니다.

2> "비 XML 메시지에서이 작업에 지정된 XSLT 사용"을 선택하여 이진 변환으로 지정하십시오.

3> 처리 제어 파일로 다음 스타일 시트를 업로드하십시오.

<?xml version="1.0" encoding="utf-8"?> 
     <xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:dp="http://www.datapower.com/extensions" 
    version="1.0"> 

    <dp:input-mapping href="sample1.ffd" type="ffd"/> 


    <xsl:output method="xml"/> 

    <xsl:template match="/"> 
    <xsl:copy-of select="ResponseType"/> 
    <xsl:call-template name="str:tokenize"> 
    <xsl:with-param name="string" select="string" /> 

    </xsl:call-template> 
    </xsl:template> 


    <xsl:template name="str:tokenize"> 
<xsl:with-param name="string" select=""> 

    str:tokenize('string', '|') 
</xsl:with param> 
</xsl:template> 
    </xsl:stylesheet> 

여기에 내가 내 로컬에 업로드 한 내 sample1.ffd (수 있습니다 : 데이터 파워

<File name="ResponseType"> 
<!-- capture all data into this tag --> 
<Field name="ResCode/Id/SoftCode/StatusCode" /> 
</File> 

에서 // 디렉토리하지만 출력을 원하는지고 있지 않다, 내 생각 내 XSLT는 매우 잘못된 것입니다 ? 내가 무엇을 할 수 내가 IBM 데이터 파워는이 문제를 해결하는 방법을 모르겠어요

+0

흠, XSLT는 XML -> 뭔가 (일반적으로 다른 XML) 변환을위한 것입니다. AFAIK는 XML (또는 적어도 동등한 데이터 유형)이 XSLT의 유일한 데이터 소스가 될 수 있습니다. – user3159253

+0

XSLT에는 몇 가지 문제가 있습니다. "str"은 정의되지 않은 네임 스페이스이고'xsl : template '에서'xsl : with-param'을 사용하면 아마도'xsl : param'이어야합니다. –

+0

IBM DataPower에는 FFD (Contivo)라는 변압기가 있습니다. DataPower는 들어오는 데이터가 XML이 아니므로 일반 XSLT가 불행히도 작동하지 않는다는 것을 이해해야합니다 ... 아래 FFD 사용에 대한 내 대답을 참조하십시오. 바이너리 (= non-xml) 변환을 위해 WebSphere Transformation Extender (WTX)를 조사해야 할 것이다. – Anders

답변

0

출력을 원하는 얻을,하지만 XSLT를 들어, 적어도 XML 요소에 입력을 감싸는 것 :

<Whatever> 
10|20003|24/23/25|23890 
</Whatever> 

그리고 나서 다음과 같이 변환 할 수 있습니다. 어려운 부분은 텍스트 입력을 분할하는 것입니다. XSLT 1.0에는 사용할 수있는 함수가 없으므로 재귀 템플릿이 필요합니다. (

<File name="CSVFILE"> 
    <Group name="CSVLine" minOccurs="0" maxOccurs="unbounded" delim="\n"> 
     <Field name="id"/> 
     <Field name="fname" delim=","/> 
     <Field name="lname" delim=","/> 
     <Field name="title" delim=","/> 
     <Field name="dept" delim=","/> 
     <Field name="org"/> 
    </Group> 
</File> 

2) XSLT 추가이 :

1) 나의 오래된 교육 샘플 중 하나) 아래 FFD 파일을 (추가 작업을해야 FFD에게 다음을 사용하여 데이터 파워에서

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxml="urn:schemas-microsoft-com:xslt" version="1.0" exclude-result-prefixes="msxml"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="/"> 
    <xsl:variable name="tokenized"> 
     <items> 
     <xsl:call-template name="tokenize"> 
      <xsl:with-param name="string" select="//text()" /> 
     </xsl:call-template> 
     </items> 
    </xsl:variable> 
    <ResponseType> 
     <ResCode> 
     <xsl:copy-of select="msxml:node-set($tokenized)/items/item[1]/text()" /> 
     </ResCode> 
     <Id> 
     <xsl:copy-of select="msxml:node-set($tokenized)/items/item[2]/text()" /> 
     </Id> 
     <SoftCode> 
     <xsl:copy-of select="msxml:node-set($tokenized)/items/item[3]/text()" /> 
     </SoftCode> 
     <StatusCode> 
     <xsl:copy-of select="msxml:node-set($tokenized)/items/item[4]/text()" /> 
     </StatusCode> 
    </ResponseType> 
    </xsl:template> 

    <xsl:template name="tokenize"> 
    <xsl:param name="string" /> 
    <xsl:variable name="item" select="normalize-space(substring-before(concat($string, '|'), '|'))" /> 
    <xsl:if test="$item"> 
     <item> 
     <xsl:value-of select="$item" /> 
     </item> 
     <xsl:call-template name="tokenize"> 
     <xsl:with-param name="string" select="substring-after($string,'|')" /> 
     </xsl:call-template> 
    </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 
+0

IBM DataPower에는 FFD (Contivo)라는 변압기가 있습니다. DataPower는 들어오는 데이터가 XML이 아니므로 일반 XSLT가 불행히도 작동하지 않는다는 것을 이해해야합니다 ... 아래 FFD 사용에 대한 내 대답을 참조하십시오. – Anders

2

하나 단순히 복사 출력에 FFD 변환 된 XML) :

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:dp="http://www.datapower.com/extensions" 
       version="1.0"> 

    <dp:input-mapping href="CSVFILE.FFD" type="ffd"/> 

    <!-- This stylesheet copies the input to the output --> 
    <xsl:output method="xml"/> 

    <xsl:template match="/"> 

     <xsl:copy-of select="." /> 

    </xsl:template> 
</xsl:stylesheet> 

3) 메시지 보내기 :

1,Anders,Wasen,B2B Architect,DataPower Dev,Enfo Zystems 
2,Jean-Luc,Piccard,Captain,USS Enterprise,Star Fleet 

4)이 다음과 같은 XML가 발생합니다 :

<?xml version="1.0" encoding="UTF-8"?> 
<CSVFILE> 
<CSVLine> 
    <id>1</id> 
    <fname>Anders</fname> 
    <lname>Wasen</lname> 
    <title>B2B Architect</title> 
    <dept>DataPower Dev,Enfo Zystems</dept> 
    <org/> 
</CSVLine> 
<CSVLine> 
    <id>2</id> 
    <fname>Jean-Luc</fname> 
    <lname>Piccard</lname> 
    <title>Captain</title> 
    <dept>USS Enterprise,Star Fleet</dept> 
    <org/> 
</CSVLine> 
</CSVFILE> 

것은 당신이 "바이너리 변환"에 XSLT 변환 작업을 변경했는지 확인하고 설정 요청 유형을 "비 XML", 그것은 다른 작동 안 할 것이다!

희망이 도움이 될 것입니다! :)