[英]XSLT help - transform attributes to elements and rename elements
我是XSLT新手,正在嘗試將以下XML轉換為下一個XML。 我已經評論了第二個XML中需要進行的重大更改。
有2個主要更改:
1)由於node2元素名稱重復,因此我想重命名第二次出現的元素。 2)我希望itemName屬性每個都成為一個Element。 2a)對於[Customer ID] itemValue,當轉換為Element時,我需要將其重命名為'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>fmaraicar@linked2pay.com</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>fmaraicar@linked2pay.com</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>fMcDonald@somewhere.com</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>fMcDonald@somewhere.com</Email>
<Amount>1.99</Amount>
<CustomerID>CUSTOMER1</CustomerID>
<InvoiceNumbers>INV10001,INV10002</InvoiceNumbers>
</node3>
</node1>
我不能完全確定您的確切要求,但是在這種情況下,您僅轉換XML的一部分,通常最好從身份轉換開始
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
然后,您只需要為要轉換的節點編寫模板。 因此,例如,要將node2
重命名為node2b
您可以這樣做...
<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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.