如何使用Biztalk映射器将数组映射到固定字段

时间:2014-11-04 15:39:43

标签: xml xslt xsd biztalk biztalk-mapper

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

    <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内联转换完成的,你能指出我最好的方向吗?

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

如果第一个模式是&#34;数组&#34;对象为什么你这么确定目标模式中只有Obj1和Obj2?