1

我需要重新映射这样的对象数组:

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

4

2 回答 2

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>
于 2014-11-04T21:55:47.770 回答
0

If the 1st schema is an "array" of objects. Why you are so sure there're only Obj1 and Obj2 in your target schema?

于 2014-11-05T22:33:00.257 回答