【问题标题】:Flat file data mapping to sibling nodes平面文件数据映射到兄弟节点
【发布时间】:2015-11-10 15:49:50
【问题描述】:

我有一个平面文件,其中每条记录都是一个客户,并且在该记录中有一个发货地址和账单地址。输出模式有一个带有地址子节点的客户记录。我不知道如何将传入记录中的 2 个地址映射到客户记录的同级子节点。

我有一个定义如下的输入文件:

<customer>
    <customernum/>
    <shipaddrcity/>
    <shipaddrstate/>
    <shipaddrzip/>
    <billaddrcity/>
    <billaddrstate/>
    <billaddrzip/>
</customer>

输出最终需要看起来像:

<customer>
    <customernum/>
    <addr>
        <type/>
        <city/>
        <state/>
        <zip/>
    </addr> 
    <addr>
        <type/>
        <city/>
        <state/>
        <zip/>
    </addr>
</customer>

我对 biztalk 还很陌生,无法找到任何合适的示例来说明如何使用 Biztalk 映射器完成此操作。我也愿意听听如何用 xslt 做到这一点。

【问题讨论】:

  • "* 我也愿意听听如何使用 xslt 来做到这一点。*" 在 XSLT 中这样做是微不足道的。花一个小时学习在线教程,你就会知道怎么做。
  • 您尝试了哪些方法,结果如何?这是一篇博客,其中显示了一个示例 hestia.typepad.com/flatlander/2007/01/mapping_fixed_e.html
  • 感谢 Dijkgraaf。表格循环是我一直试图开始工作的。我的实际映射模式更复杂,但我只需要先获取一些更简单模式的示例。在这一点上,我真的必须从简单开始,因为我对 Biztalk 的了解还不够,无法提出有用的问题。

标签: xslt biztalk biztalk-mapper


【解决方案1】:

您可能想要一些特定于 BizTalk 的东西,而我对 BizTalk 一无所知,但这可能对您有所帮助。

给定一个输入文档...

<customers>
<customer>
    <customernum>1</customernum>
    <shipaddrcity>Cairns</shipaddrcity>
    <shipaddrstate>QLD</shipaddrstate>
    <shipaddrzip>b</shipaddrzip>
    <billaddrcity>Sydney</billaddrcity>
    <billaddrstate>NSW</billaddrstate>
    <billaddrzip>c</billaddrzip>
</customer>
<customer>
    <customernum>2</customernum>
    <shipaddrcity>d</shipaddrcity>
    <shipaddrstate>WA</shipaddrstate>
    <shipaddrzip>e</shipaddrzip>
    <billaddrcity>Melbourne</billaddrcity>
    <billaddrstate>Vic</billaddrstate>
    <billaddrzip>f</billaddrzip>
</customer>
</customers>

...这个 XSLT 1.0 样式表...

<xsl:transform
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

<xsl:output omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*" />

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="customer">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()[not(
      self::shipaddrstate|
      self::shipaddrzip  |
      self::billaddrstate|
      self::billaddrzip   )]"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="shipaddrcity">
  <addr>
    <type>ship</type>
    <city><xsl:value-of select="." /></city>
    <xsl:apply-templates select="../(shipaddrstate|shipaddrzip)" />
  </addr> 
</xsl:template>

<xsl:template match="billaddrcity">
  <addr>
    <type>bill</type>
    <city><xsl:value-of select="." /></city>
    <xsl:apply-templates select="../(billaddrstate|billaddrzip)" />
  </addr> 
</xsl:template>

<xsl:template match="shipaddrstate|billaddrstate">
  <state><xsl:value-of select="." /></state>
</xsl:template>

<xsl:template match="shipaddrzip|billaddrzip">
  <zip><xsl:value-of select="." /></zip>
</xsl:template>

</xsl:transform>

...当应用于输入文档时,将产生...

<customers>
   <customer>
      <customernum>1</customernum>
      <addr>
         <type>ship</type>
         <city>Cairns</city>
         <state>QLD</state>
         <zip>b</zip>
      </addr>
      <addr>
         <type>bill</type>
         <city>Sydney</city>
         <state>NSW</state>
         <zip>c</zip>
      </addr>
   </customer>
   <customer>
      <customernum>2</customernum>
      <addr>
         <type>ship</type>
         <city>d</city>
         <state>WA</state>
         <zip>e</zip>
      </addr>
      <addr>
         <type>bill</type>
         <city>Melbourne</city>
         <state>Vic</state>
         <zip>f</zip>
      </addr>
   </customer>
</customers>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    相关资源
    最近更新 更多