簡體   English   中英

XSLT幫助-將屬性轉換為元素並重命名元素

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM