2012-08-10 196 views
-1

我開始學習xslt來操縱xml並嘗試平鋪xml,它具有許多不同的子節點和孫節點。是否有任何簡單的xslt將輸入xml轉換爲output.xml。xslt扁平xml節點子節點和孫子節點

的input.xml:

<Addresses> 
    <Address__c> 
    <Id>a0H20000002uhsyEAA</Id> 
    <R00N20000001XA10EAG> 
     <Customer_Installation_Address__c> 
      <Id>a0L2000000DDpOCEA1</Id> 
     </Customer_Installation_Address__c> 
     <Customer_Installation_Address__c> 
      <Id>a0L2000000DDpOCEB2</Id> 
     </Customer_Installation_Address__c> 
    </R00N20000001XA10EAG> 
    <Customers__r> 
     <Account> 
      <Id>001M000000FOEiHIAX</Id> 
     </Account> 
     <Account> 
      <Id>001M000000FOAAbIAP</Id> 
     </Account> 
    </Customers__r> 
    <Cases__r> 
     <Case> 
      <Id>500D000000G7drpIAB</Id> 
     </Case> 
    </Cases__r> 
    </Address__c> 
    <Address__c> 
    <Id>a0H20000003JjyzEAC</Id> 
    <Cases__r> 
     <Case> 
      <Id>500D000000G7drpIAB</Id> 
     </Case> 
    </Cases__r> 
    </Address__c> 
    <Address__c> 
    <Id>a0HD0000007wQ0EMAU</Id> 
    <Customers__r> 
     <Account> 
      <Id>001M000000FOEiHIAX</Id> 
     </Account> 
     <Account> 
      <Id>001M000000FOAAbIAP</Id> 
     </Account> 
    </Customers__r> 
    </Address__c> 
</Addresses> 

,並希望產品的下列XML輸出。

的Output.xml

<Addresses> 
    <Address__c> 
    <AddrId>a0H20000002uhsyEAA</AddrId> 
    <CIAddressId>a0L2000000DDpOCEA1</CIAddressId> 
    <CIAddressId>a0L2000000DDpOCEB2</CIAddressId> 
    <AccountId>001M000000FOEiHIAX</AccountId> 
    <AccountId>001M000000FOAAbIAP</AccountId> 
    <CaseId>500D000000G7drpIAB</CaseId> 
    </Address__c> 
    <Address__c> 
    <AddrId>a0H20000003JjyzEAC</AddrId> 
    <CaseId>500D000000G7drpIAB</CaseId> 
    </Address__c> 
    <Address__c> 
    <AddrId>a0HD0000007wQ0EMAU</AddrId> 
    <AccountId>001M000000FOEiHIAX</AccountId> 
    <AccountId>001M000000FOAAbIAP</AccountId> 
    </Address__c> 
</Addresses> 

回答

1

像這樣的東西(有更簡潔的方式來表達的話):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
    <Addresses> 
     <xsl:apply-templates select="Addresses/Address__c" /> 
    </Addresses> 
    </xsl:template> 

    <xsl:template match="Address__c"> 
    <Address__c> 
     <xsl:apply-templates select="descendant::Id" /> 
    </Address__c> 
    </xsl:template> 

    <xsl:template match="Id"> 
    <Id><xsl:value-of select="." /></Id> 
    </xsl:template> 
</xsl:stylesheet> 

會給你

<Addresses> 
<Address__c> 
    <Id>a0H20000002uhsyEAA</Id> 
    <Id>a0L2000000DDpOCEA1</Id> 
    <Id>a0L2000000DDpOCEB2</Id> 
    <!-- ... --> 

現在你可以添加額外的模板根據其父項更改Id元素的名稱:

<xsl:template match="Address__c/Id"> 
    <AddrId><xsl:value-of select="." /></AddrId> 
</xsl:template> 

<xsl:template match="Customer_Installation_Address__c/Id"> 
    <CIAddressId><xsl:value-of select="." /></CIAddressId> 
</xsl:template> 

+0

非常感謝伊恩。有用!!! – user1578619 2012-08-13 10:27:47