【问题标题】:How to map an array to fixed fields using Biztalk mapper如何使用 Biztalk 映射器将数组映射到固定字段
【发布时间】:2014-11-04 15:39:42
【问题描述】:

我需要像这样重新映射一组对象:

    <Root>
      <ListOfObjs>
        <Obj>
          <Attr1>0000</Attr1>
          <Attr2>Hello!</Attr2>
        </Obj>
        <Obj>
          <Attr1>1111</Attr1>
          <Attr2>Hello1!</Attr2>
        </Obj>
      </ListOfObjs>
    </Root>

到这样的输出:

        <Root>
            <Obj1_Attr1>0000</Obj1_Attr1>
            <Obj1_Attr2>Hello!</Obj1_Attr2>
            <Obj2_Attr1>1111</Obj2_Attr1>
            <Obj2_Attr2>Hello1!</Obj2_Attr2>
        </Root>

所以在我的 XSD 架构中,我有这样的东西:

架构输入

                           <xs:element name="Root">
                            <xs:complexType>
                             <xs:sequence>
                              <xs:element name="ListOfObjs">
                               <xs:complexType>
                                <xs:sequence>
                                 <xs:element name="Obj">
                                  <xs:complexType>
                                   <xs:sequence>
                                    <xs:element name="Attr1">
                                     <xs:simpleType>
                                      <xs:restriction base="xs:string">
                                       <xs:minLength value="1"/>
                                       <xs:maxLength value="50"/>
                                      </xs:restriction>
                                     </xs:simpleType>
                                    </xs:element>
                                   <xs:element name="Attr2">
                                    <xs:simpleType>
                                      <xs:restriction base="xs:string">
                                       <xs:minLength value="1"/>
                                       <xs:maxLength value="50"/>
                                      </xs:restriction>
                                     </xs:simpleType>
                                    </xs:element>
                                   </xs:sequence>
                                  </xs:complexType>
                                 </xs:element>
                                </xs:sequence>
                               </xs:complexType>
                              </xs:element>

架构输出

                                 <xs:element name="Root">
                                  <xs:complexType>
                                   <xs:sequence>
                                    <xs:element name="Obj1_Attr1">
                                     <xs:simpleType>
                                      <xs:restriction base="xs:string">
                                       <xs:minLength value="1"/>
                                       <xs:maxLength value="50"/>
                                      </xs:restriction>
                                     </xs:simpleType>
                                    </xs:element>
                                   <xs:element name="Obj1_Attr2">
                                    <xs:simpleType>
                                      <xs:restriction base="xs:string">
                                       <xs:minLength value="1"/>
                                       <xs:maxLength value="50"/>
                                      </xs:restriction>
                                     </xs:simpleType>
                                    </xs:element>
                                    <xs:element name="Obj2_Attr1">
                                    <xs:simpleType>
                                      <xs:restriction base="xs:string">
                                       <xs:minLength value="1"/>
                                       <xs:maxLength value="50"/>
                                      </xs:restriction>
                                     </xs:simpleType>
                                    </xs:element>
                                    <xs:element name="Obj2_Attr2">
                                    <xs:simpleType>
                                      <xs:restriction base="xs:string">
                                       <xs:minLength value="1"/>
                                       <xs:maxLength value="50"/>
                                      </xs:restriction>
                                     </xs:simpleType>
                                    </xs:element>
                                   </xs:sequence>
                                  </xs:complexType>
                                 </xs:element>

此外,我必须评估每个值,因为我发现了一些条件,例如 if value=0000 ,其中输出应该为 NULL。

最好的方法是什么?

我正在考虑开发一个自定义 functoid,但我不确定这是否是最好的方法,可能可以使用 XSLT 内联转换来完成,你能指出最好的方向吗?

【问题讨论】:

  • 到目前为止,您对映射进行了哪些尝试?您尝试的方法有什么问题?

标签: xml xslt xsd biztalk biztalk-mapper


【解决方案1】:

首先,您的架构有一些错误:

Schema1 的正确 XSD 必须是:

<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="ListOfObjs">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Obj" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Attr1">
                      <xs:simpleType>
                        <xs:restriction base="xs:string">
                          <xs:minLength value="1"/>
                          <xs:maxLength value="50"/>
                        </xs:restriction>
                      </xs:simpleType>
                    </xs:element>
                    <xs:element name="Attr2">
                      <xs:simpleType>
                        <xs:restriction base="xs:string">
                          <xs:minLength value="1"/>
                          <xs:maxLength value="50"/>
                        </xs:restriction>
                      </xs:simpleType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

我想出了以下内容

<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:msxsl="urn:schemas-microsoft-com:xslt">

  <xsl:template match="/">
    <Root>
      <xsl:for-each select="/Root/ListOfObjs/Obj">
        <xsl:variable name="objName" select="name(.)"/>
        <xsl:variable name="objPos" select="position()"/>

        <xsl:for-each select="*">
          <xsl:variable name="nodeName" select="name(.)"/>

          <xsl:variable name="name" select="concat($objName, $objPos, $nodeName)"/>

          <xsl:element name="{$name}">
            <xsl:value-of select="."/>
          </xsl:element>

        </xsl:for-each>

      </xsl:for-each>
    </Root>
  </xsl:template>

</xsl:stylesheet>

使用以下输入:

<Root>
  <ListOfObjs>
    <Obj>
      <Attr1>0000</Attr1>
      <Attr2>Hello!</Attr2>
    </Obj>
    <Obj>
      <Attr1>1111</Attr1>
      <Attr2>Hello1!</Attr2>
    </Obj>
  </ListOfObjs>
</Root>

这给出了以下输出:

<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:msxsl="urn:schemas-microsoft-com:xslt">
  <Obj1Attr1>0000</Obj1Attr1>
  <Obj1Attr2>Hello!</Obj1Attr2>
  <Obj2Attr1>1111</Obj2Attr1>
  <Obj2Attr2>Hello1!</Obj2Attr2>
</Root>

【讨论】:

  • 谢谢你,你太棒了。但是现在,假设我使用这个解决方案来创建我想要作为我的 Biztalk 自定义项目的输出文件的输出。如何将这 4 个新字段映射到我的 xsd 架构输出?
  • 恐怕我没有关注:您指的是什么 XSD 架构输出?问题是关于指定的输入和输出架构。是否需要第二个映射?这不是您的一部分(原始)问题。请详细说明。
【解决方案2】:

如果第一个模式是对象的“数组”。为什么您如此确定目标架构中只有 Obj1 和 Obj2?

【讨论】:

  • 因为这是一个要求
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 2012-01-23
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-03
相关资源
最近更新 更多