2012-11-02 16 views
1

我想從soap env複製XML,並且我已經能夠成功完成此操作。接下來,我想刪除所有的XMLNS,這也是我能夠成功完成的。不過,我現在試圖從XML有效載荷中選擇一個XSI屬性,並在XML中創建一個包含XSI = TYPE字段內容的新字段。我將證明我所希望做的:XSLT刪除Soap Env並將SINGLE XSI標記複製到它自己的字段

示例XML:

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soapenv:Body> 
     <notifications xmlns="http://soap.sforce.com/2005/09/outbound"> 
      <ActionId>04kf000000000FfAAI</ActionId> 
      <SessionId xsi:nil="true"/> 
      <Notification> 
       <Id>04lf00000000xvQAAQ</Id> 
       <sObject xsi:type="sf:Account" xmlns:sf="urn:sobject"> 
        <sf:Id>001f0000006UzdCAAS</sf:Id> 
        <sf:Customer_Number__c>dummy1234</sf:Customer_Number__c> 
        <sf:FirstName>Test</sf:FirstName> 
        <sf:LastModifiedDate>2012-10-15T10:59:54.000Z</sf:LastModifiedDate> 
        <sf:LastName>Test</sf:LastName> 
       </sObject> 
      </Notification> 
     </notifications> 
    </soapenv:Body> 
</soapenv:Envelope> 

CURRENT XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:r="http://soap.sforce.com/2005/09/outbound" 
    exclude-result-prefixes="r"> 

    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="/soap:Envelope//r:notifications"/> 
    </xsl:template> 

    <xsl:template match ="*" > 
     <xsl:element name ="{local-name()}" > 
      <xsl:apply-templates select ="@* | node()" /> 
     </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

OUTPUT:

<?xml version="1.0" encoding="utf-8"?> 
<notifications> 
    <ActionId>04kf000000000FfAAI</ActionId> 
    <SessionId>true</SessionId> 
    <Notification> 
     <Id>04lf00000000xvQAAQ</Id> 
     <sObject>tableName<Id>001f0000006UzdCAAS</Id> 
     <Customer_Number__c>dummy1234</Customer_Number__c> 
     <FirstName>Test</FirstName> 
     <LastModifiedDate>2012-10-15T10:59:54.000Z</LastModifiedDate> 
     <LastName>Test</LastName> 
     </sObject> 
    </Notification> 
</notifications> 

這是不正確的,只是把在SObject中的XSI:TYPE的內容,並且我需要在它自己的字段中,例如這是所需的輸出:

<?xml version="1.0" encoding="utf-8"?> 
<notifications> 
    <ActionId>04kf000000000FfAAI</ActionId> 
    <SessionId>true</SessionId> 
    <Notification> 
     <Id>04lf00000000xvQAAQ</Id> 
     <sObject> 
     <tableName>tableName</tableName> 
     <Id>001f0000006UzdCAAS</Id> 
     <Customer_Number__c>dummy1234</Customer_Number__c> 
     <FirstName>Test</FirstName> 
     <LastModifiedDate>2012-10-15T10:59:54.000Z</LastModifiedDate> 
     <LastName>Test</LastName> 
     </sObject> 
    </Notification> 
</notifications> 

回答

2

通過添加新的模板做sObject自定義處理,您可以動粗屬性出到一個新的元素,然後繼續處理。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:r="http://soap.sforce.com/2005/09/outbound" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    exclude-result-prefixes="r soap xsi"> 

    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="/soap:Envelope//r:notifications"/> 
    </xsl:template> 

    <xsl:template match ="*" > 
     <xsl:element name ="{local-name()}" > 
      <xsl:apply-templates select ="@* | node()" /> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="*[local-name()='sObject']"> 
     <sObject> 
      <tableName> 
       <xsl:value-of select="@xsi:type"/> 
      </tableName> 
      <xsl:apply-templates /> 
     </sObject> 
    </xsl:template> 

</xsl:stylesheet> 

這將產生輸出:

<?xml version="1.0" encoding="utf-8"?> 
<notifications> 
    <ActionId>04kf000000000FfAAI</ActionId> 
    <SessionId>true</SessionId> 
    <Notification> 
    <Id>04lf00000000xvQAAQ</Id> 
    <sObject> 
     <tableName>sf:Account</tableName> 
     <Id>001f0000006UzdCAAS</Id> 
     <Customer_Number__c>dummy1234</Customer_Number__c> 
     <FirstName>Test</FirstName> 
     <LastModifiedDate>2012-10-15T10:59:54.000Z</LastModifiedDate> 
     <LastName>Test</LastName> 
    </sObject> 
    </Notification> 
</notifications> 

留在你原來的XSLT的精神,如果你想避免添加xsi命名空間,你也可以在屬性複製像這樣:

<xsl:value-of select="@*[local-name()='type']"/> 
+1

謝謝,像夢一樣工作! – MMKD