2

'|' で区切られた非 xml テキスト ファイルを転送したい Datapower を使用して文字を xml に変換します。

Following is file  (sample1)

10|20003|24/23/25|23890

これを次の XML に分割する必要があります。

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

私がしたことは次のことでした--

1>XML 以外のリクエストを受け取るサービスに変換アクションを作成します。

2>「このアクションで指定された XSLT を非 XML メッセージで使用する」を選択して、これがバイナリ変換であることを指定します。

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 です (Datapower の local:// ディレクトリにアップロードしたものです)。

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

しかし、目的の出力が得られません。私の xslt はかなり間違っていると思います。目的の出力を得るにはどうすればよいですか?

4

2 に答える 2

0

IBM Datapower がこの問題をどのように解決するかはわかりませんが、XSLT の場合は、少なくとも入力を XML 要素でラップします。

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

そして、次のような変換を続けることができます。難しいのは、テキスト入力を分割することです。XSLT 1.0 では、そのために使用できる関数がないため、再帰的なテンプレートが必要です。

<?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>
于 2014-02-15T16:37:37.323 に答える