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

最初のスキーマがオブジェクトの「配列」である場合。ターゲット スキーマに Obj1 と Obj2 しかないと確信できるのはなぜですか?

于 2014-11-05T22:33:00.257 に答える