[英]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.