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> 选择“在非 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(我已将其上传到 Datapower 的本地:// 目录中

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

但是我没有得到想要的输出,我认为我的 xslt 是完全错误的我该怎么做才能得到想要的输出?

4

2 回答 2

2

在使用 FFD 的 DataPower 中,以下应该可以工作:

1) 添加 FFD 文件(在我的旧教育样本之一下方):

<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(这只是将 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”,否则它将不起作用!

希望对你有帮助!:)

于 2014-02-27T14:26:13.250 回答
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 回答