0

入力から取得した値を使用して、別の XML に変換しようとしている入力 XML メッセージがあります。それを調べて、サンプルの XSLT を教えてもらえますか?

入力 XML:

<Req_IN>

  <ReqID_IN>REQIDIN001</ReqID_IN>
  <ReqType_IN>AZZ002</ReqType_IN>
  <VMID_IN>VMIDINV003</VMID_IN>
  <PSMID_IN>PSMIDIN004</PSMID_IN>
  <SIDHIQ_IN>sssiiidddd54005</SIDHIQ_IN>
  <SIP_IN>SIP_IN_10.20.30.40</SIP_IN>
  <MPass_IN>full details of buyer</MPass_IN>
  <currency_IN>USD</currency_IN>
  <amt_IN>167.78</amt_IN>

  <MIDets_IN>
    <itCode_IN>a</itCode_IN>
    <itDesc_IN>aadesc</itDesc_IN> 
    <itUntprice_IN>555</itUntprice_IN>
    <itQuan_IN>41</itQuan_IN>
  </MIDets_IN>

  <MIDets_IN>
    <itCode_IN>b</itCode_IN>
    <itDesc_IN>bbbdesc</itDesc_IN> 
    <itUntprice_IN>44343</itUntprice_IN>
    <itQuan_IN>32</itQuan_IN>
  </MIDets_IN>

  <MIDets_IN>
    <itCode_IN>c</itCode_IN>
    <itDesc_IN>abcdesc</itDesc_IN> 
    <itUntprice_IN>8979</itUntprice_IN>
    <itQuan_IN>32</itQuan_IN>
  </MIDets_IN>

  <ConBDetails_IN>
    <cname_IN>firstname lastname</cname_IN>
    <ConAddress1>ConBDetails addressline1 </ConAddress1>
    <ConAddress2>ConBDetails addressline2</ConAddress2>
    <ConAddress3>ConBDetails addressline3</ConAddress3>
    <City_IN>ConBdetails_city</City_IN>
    <pcode_IN>ConBdetails_PIN</pcode_IN>
    <c_IN>ConBdetails US</c_IN>
  </ConBDetails_IN>

  <mShipDets_IN>
    <FullName>fname lname</FullName>
    <MerAddress1>mShip addressline1</MerAddress1>
    <MerAddress2>mShip addressline2</MerAddress2>
    <MerAddress3>mShip addressline3</MerAddress3>
    <City_IN>mShip city</City_IN>
    <pcode_IN>mShip PIN</pcode_IN>
    <c_IN>mSHIP US</c_IN>
  </mShipDets_IN>

  <VmeTransactionIdentifier>
    <VMeUniqueId> a9001</VMeUniqueId> 
    <AuthenticationMethod>01</AuthenticationMethod>
    <AuthenticationReasonCode>1C</AuthenticationReasonCode>
  </VmeTransactionIdentifier>

</Req_IN>

出力 XML:

<Req_IN_new>

  <PSMID_IN_new>value of PSMID_IN element(PSMIDIN004)</PSMID_IN_new>
  <ReqID_IN_new>value of ReqID_IN element (REQIDIN001)</ReqID_IN_new>
  <SPT_new>value of ReqID_IN element (REQIDIN001)</SPT_new>

  <ConBDetails_IN_new>
    <cname_IN_new>firstname lastname</cname_IN_new>
    <street1>ConBDetails addressline1 </street1>
    <street2>ConBDetails addressline2 </street2>
    <street3>ConBDetails addressline3</street3>
    <city>ConBdetails_city</city>
    <postalCode>ConBdetails_PIN</postalCode>
    <country>ConBdetails_US</country>
    <ipAddress>value of SIP_IN element (SIP_IN_10.20.30.40)</ipAddress>
  </ConBDetails_IN_new>

  <MPass_IN_new>full details of buyer </MPass_IN_new>

  <mShipDets_IN_new>
    <FullName_new>fname lname</FullName_new>
    <MerAddress1_new>mShip addressline1</MerAddress1_new>
    <MerAddress2_new>mShip addressline2</MerAddress2_new>
    <MerAddress3_new>mShip addressline3</MerAddress3_new>
    <City_IN_new>mShip city</City_IN_new>
    <pcode_IN_new>mShip PIN</pcode_IN_new>
    <c_IN_new>mSHIP US</c_IN_new>
  </mShipDets_IN_new>

  <MIDets_IN_new id="0">
    <itCode_IN_new>a</itCode_IN_new>
    <itDesc_IN_new>aadesc</itDesc_IN_new> 
    <itUntprice_IN_new>555</itUntprice_IN_new>
    <itQuan_IN_new>41</itQuan_IN_new>
  </MIDets_IN_new>

  <MIDets_IN_new id="1">
    <itCode_IN_new>b</itCode_IN_new>
    <itDesc_IN_new>bbbdesc</itDesc_IN_new> 
    <itUntprice_IN_new>44343</itUntprice_IN_new>
    <itQuan_IN_new>32</itQuan_IN_new>
  </MIDets_IN_new>

  <MIDets_IN_new id="2">
    <itCode_IN_new>c</itCode_IN_new>
    <itDesc_IN_new>abcdesc</itDesc_IN_new> 
    <itUntprice_IN_new>8979</itUntprice_IN_new>
    <itQuan_IN_new>41</itQuan_IN_new>
  </MIDets_IN_new>

  <totalAmt>
    <amt_IN_new>167.78</amt_IN_new>
    <currency_IN_new>USD</currency_IN_new>
  </totalAmt>

</Req_IN_new>
4

2 に答える 2

0

xsl:templatexsl_value-ofおよびなどの XSL 要素を使用して、XML 要素を反復処理する必要がありますxsl:apply-templates。私はあなたのためにそれをするつもりはありませんが、ここに典型的なスニペットがあります:

<xsl:template match="ConAddress1">
    <street1><xsl:value-of select="."/></street1>
</xsl:template>

ここでは、1 つの要素名から変換し、その内容を選択して新しい要素を作成しています ( street1)。XSL には、約 30 のテンプレートを含めることができます。

チュートリアルを見ると、このタイプの変換の例がたくさんあります。

于 2013-05-19T21:28:14.993 に答える
0

この変換は、あなたが求めることを行います。基本的に、ルート要素のテンプレートは、出力に表示される順序でソースから要素を選択し、次に汎用テンプレートが各要素をコピー_newして名前に追加します。

他の多くのテンプレートは、他のテンプレートとは異なる方法で処理される要素を処理します。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

  <xsl:template match="/Req_IN">
    <Req_IN_new>
      <xsl:apply-templates select="PSMID_IN"/>
      <xsl:apply-templates select="ReqID_IN"/>
      <xsl:apply-templates select="ConBDetails_IN"/>
      <xsl:apply-templates select="MPass_IN"/>
      <xsl:apply-templates select="mShipDets_IN"/>
      <xsl:apply-templates select="MIDets_IN"/>
      <totalAmt>
        <amt_IN_new>
          <xsl:value-of select="amt_IN"/>
        </amt_IN_new>
        <currency_IN_new>
          <xsl:value-of select="currency_IN"/>
        </currency_IN_new>
      </totalAmt>
    </Req_IN_new>
  </xsl:template>

  <xsl:template match="*">
    <xsl:element name="{concat(name(), '_new')}">
      <xsl:apply-templates/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="ReqID_IN">
    <xsl:element name="{concat(name(), '_new')}">
      <xsl:apply-templates/>
    </xsl:element>
    <SPT_new>
      <xsl:apply-templates/>
    </SPT_new>
  </xsl:template>

  <xsl:template match="ConBDetails_IN">
    <xsl:element name="{concat(name(), '_new')}">
      <xsl:apply-templates/>
      <ipAddress>
        <xsl:value-of select="preceding-sibling::SIP_IN"/>
      </ipAddress>
    </xsl:element>
  </xsl:template>

  <xsl:template match="ConBDetails_IN/*[starts-with(name(),'ConAddress')]">
    <xsl:element name="{concat('street', substring-after(name(), 'ConAddress'))}">
      <xsl:apply-templates/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="ConBDetails_IN/City_IN">
    <city>
      <xsl:apply-templates/>
    </city>
  </xsl:template>

  <xsl:template match="ConBDetails_IN/pcode_IN">
    <postalCode>
      <xsl:apply-templates/>
    </postalCode>
  </xsl:template>

  <xsl:template match="ConBDetails_IN/c_IN">
    <country>
      <xsl:apply-templates></xsl:apply-templates>
    </country>
  </xsl:template>

  <xsl:template match="MIDets_IN">
    <xsl:element name="{concat(name(), '_new')}">
      <xsl:attribute name="id">
        <xsl:value-of select="position()-1"/>
      </xsl:attribute>
      <xsl:apply-templates/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>

出力

<Req_IN_new>
   <PSMID_IN_new>PSMIDIN004</PSMID_IN_new>
   <ReqID_IN_new>REQIDIN001</ReqID_IN_new>
   <SPT_new>REQIDIN001</SPT_new>
   <ConBDetails_IN_new>
      <cname_IN_new>firstname lastname</cname_IN_new>
      <street1>ConBDetails addressline1 </street1>
      <street2>ConBDetails addressline2</street2>
      <street3>ConBDetails addressline3</street3>
      <city>ConBdetails_city</city>
      <postalCode>ConBdetails_PIN</postalCode>
      <country>ConBdetails US</country>
      <ipAddress>SIP_IN_10.20.30.40</ipAddress>
   </ConBDetails_IN_new>
   <MPass_IN_new>full details of buyer</MPass_IN_new>
   <mShipDets_IN_new>
      <FullName_new>fname lname</FullName_new>
      <MerAddress1_new>mShip addressline1</MerAddress1_new>
      <MerAddress2_new>mShip addressline2</MerAddress2_new>
      <MerAddress3_new>mShip addressline3</MerAddress3_new>
      <City_IN_new>mShip city</City_IN_new>
      <pcode_IN_new>mShip PIN</pcode_IN_new>
      <c_IN_new>mSHIP US</c_IN_new>
   </mShipDets_IN_new>
   <MIDets_IN_new id="0">
      <itCode_IN_new>a</itCode_IN_new>
      <itDesc_IN_new>aadesc</itDesc_IN_new>
      <itUntprice_IN_new>555</itUntprice_IN_new>
      <itQuan_IN_new>41</itQuan_IN_new>
   </MIDets_IN_new>
   <MIDets_IN_new id="1">
      <itCode_IN_new>b</itCode_IN_new>
      <itDesc_IN_new>bbbdesc</itDesc_IN_new>
      <itUntprice_IN_new>44343</itUntprice_IN_new>
      <itQuan_IN_new>32</itQuan_IN_new>
   </MIDets_IN_new>
   <MIDets_IN_new id="2">
      <itCode_IN_new>c</itCode_IN_new>
      <itDesc_IN_new>abcdesc</itDesc_IN_new>
      <itUntprice_IN_new>8979</itUntprice_IN_new>
      <itQuan_IN_new>32</itQuan_IN_new>
   </MIDets_IN_new>
   <totalAmt>
      <amt_IN_new>167.78</amt_IN_new>
      <currency_IN_new>USD</currency_IN_new>
   </totalAmt>
</Req_IN_new>
于 2013-05-19T21:29:23.387 に答える