繁体   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