2016-08-30 10 views
0

私はXSLT初心者です。次のXMLを次のXMLに変換しようとしています。私は2番目のXMLに必要な大幅な変更についてコメントしました。XSLT help - 要素への属性の変換と要素の名前の変更

2つの主な変更点があります。

1)ノード2の要素名が繰り返されているので、私は、第二の発生の名前を変更したいです。 2)itemName属性をそれぞれElementにする必要があります。 2a)[Customer ID] itemValueの場合、要素に変換するときにCustomerIDという名前に変更する必要があります。

要約すると、ブラウザでレンダリングされた後、元のものがよりテーブルのような柱状構造に変換されるようにします。

<requestStatus> 
<node1> 
    <clientId>4634</clientId> 
    <affiliateId>0</affiliateId> 
    <contactId>144756</contactId> 
    <requestId>64086</requestId> 
    <transNumber>F27A6A65</transNumber> 
    <status>11</status> 
    <paymentType>D</paymentType> 
    <amount>1.99</amount> 
    <contactEmail>[email protected]</contactEmail> 
    <templateName>Payment Form 2</templateName> 
    <createdBy>0</createdBy> 
    <paymentCnt>1</paymentCnt> 
    <nextPaymtDate/> 
    <recurringFrequency/> 
    <maxPayments>0</maxPayments> 
    <untilDate/> 
    <node2> 
     <node2> 
      <paymtId>56991</paymtId> 
      <paidAmount>1.99</paidAmount> 
      <paymentMethod>C</paymentMethod> 
      <paymentSeq>1</paymentSeq> 
      <submissionDate>08/04/2016</submissionDate> 
      <creditCardType>V</creditCardType> 
      <creditCardNumber>1111</creditCardNumber> 
      <cardHolder>Ronald McDonald</cardHolder> 
      <expirationMonth>1</expirationMonth> 
      <expirationYear>2017</expirationYear> 
      <achRequestId>0</achRequestId> 
      <accountNumber/> 
      <accountType/> 
      <depositType/> 
      <achSubmissionDate/> 
      <achEffectiveDate/> 
     </node2> 
    </node2> 
    <node3> 
     <node4> 
      <itemName>[FirstName]</itemName> 
      <itemValue>Ronald</itemValue> 
     </node4> 
     <node4> 
      <itemName>[LastName]</itemName> 
      <itemValue>McDonald</itemValue> 
     </node4> 
     <node4> 
      <itemName>[Email]</itemName> 
      <itemValue>[email protected]</itemValue> 
     </node4> 
     <node4> 
      <itemName>[Amount]</itemName> 
      <itemValue>1.99</itemValue> 
     </node4> 
     <node4> 
      <itemName>Customer ID</itemName> 
      <itemValue>CUSTOMER1</itemValue> 
     </node4> 
     <node4> 
      <itemName>Invoice Numbers</itemName> 
      <itemValue>INV10001,INV10002</itemValue> 
     </node4> 
    </node3> 
</node1> 
</requestStatus> 


    To this: 

<requestStatus> 
<node1> 
    <clientId>4634</clientId> 
    <affiliateId>0</affiliateId> 
    <contactId>144756</contactId> 
    <requestId>64086</requestId> 
    <transNumber>F27A6A65</transNumber> 
    <status>11</status> 
    <paymentType>D</paymentType> 
    <amount>1.99</amount> 
    <contactEmail>[email protected]</contactEmail> 
    <templateName>Payment Form 2</templateName> 
    <createdBy>0</createdBy> 
    <paymentCnt>1</paymentCnt> 
    <nextPaymtDate/> 
    <recurringFrequency/> 
    <maxPayments>0</maxPayments> 
    <untilDate/> 
    <node2> 
     <node2b> <!-- since node2 element was repeated, rename this as node2b --> 
      <paymtId>56991</paymtId> 
      <paidAmount>1.99</paidAmount> 
      <paymentMethod>C</paymentMethod> 
      <paymentSeq>1</paymentSeq> 
      <submissionDate>08/04/2016</submissionDate> 
      <creditCardType>V</creditCardType> 
      <creditCardNumber>1111</creditCardNumber> 
      <cardHolder>Ronald McDonald</cardHolder> 
      <expirationMonth>1</expirationMonth> 
      <expirationYear>2017</expirationYear> 
      <achRequestId>0</achRequestId> 
      <accountNumber/> 
      <accountType/> 
      <depositType/> 
      <achSubmissionDate/> 
      <achEffectiveDate/> 
     </node2b> 
    </node2> 
    <node3> 
     <FirstName>Ronald</FirstName> <!-- each itemName attribute to become a unique Element --> 
     <LastName>McDonald</LastName> 
     <Email>[email protected]</Email> 
     <Amount>1.99</Amount> 
     <CustomerID>CUSTOMER1</CustomerID> 
     <InvoiceNumbers>INV10001,INV10002</InvoiceNumbers> 
    </node3> 
</node1> 

+1

あなたが真剣にない、番号ノード名を望んでいません。あなたのレイアウトを再考してください。 – Tomalak

+1

実際のXMLは表示されないように一時的に番号が付けられます。 – user3769185

+0

私はそれもあまり有害ではありません。人々は何のメリットも無く番号付きの要素の解決策を書くでしょう。あなたのXMLはそれほど難しいことではありません。 – Tomalak

答えて

1

私はあなたの正確な要件を完全にわからないが、あなたは唯一のXMLの一部を変換している。このような状況では、それはidentity transform

<xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
を開始することが最善であります

次に、変換するノードのテンプレートを作成するだけです。したがって、たとえば、あなたがこれを行うだろうnode2bからnode2の名前を変更するには...

<xsl:template match="node2/node2"> 
     <node2b> 
      <xsl:apply-templates select="@*|node()"/> 
     </node2b> 
    </xsl:template> 

node2/node2試合は親ではない、唯一の子node2が一致している保証します。これらをあなたの実際の要素名に置き換えてください。

node4要素について、あなたは別の値に基づいて、新しい要素を作成するために一緒に属性値テンプレートで、xsl:element要素を使用することができます

<xsl:element name="{translate(itemName, '[] ', '')}"> 
     <xsl:value-of select="itemValue" /> 
    </xsl:element> 

名から指定されたシンボルを取り除くだろう、ここでtranslate機能。 itemNameは要素ではなく、属性ではありません。

は、スターターとして、このXSLTを試してみてください:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="node2/node2"> 
     <node2b> 
      <xsl:apply-templates select="@*|node()"/> 
     </node2b> 
    </xsl:template> 

    <xsl:template match="node4"> 
     <xsl:element name="{translate(itemName, '[] ', '')}"> 
      <xsl:value-of select="itemValue" /> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 
関連する問題