2016-06-22 2 views
1

Ниже приведен входной XML в XSLTXSLT преобразование: для каждого

<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="urn:partner.soap.sforce.com" xmlns:sf="urn:sobject.partner.soap.sforce.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Header><LimitInfoHeader><limitInfo><current>4930</current><limit>5000000</limit><type>API REQUESTS</type></limitInfo></LimitInfoHeader></soapenv:Header> 
    <soapenv:Body> 
     <queryResponse> 
      <result xsi:type="QueryResult"> 
       <done>true</done> 
       <queryLocator xsi:nil="true"/> 
       <records xsi:type="sf:sObject"> 
        <sf:type>Account</sf:type> 
        <sf:Id xsi:nil="true"/> 
        <sf:Contacts xsi:type="QueryResult"> 
         <done>true</done> 
         <queryLocator xsi:nil="true"/> 
         <records xsi:type="sf:sObject"> 
          <sf:type>Contact</sf:type> 
          <sf:Id>0031700000ThqzkAAB</sf:Id> 
          <sf:Id>0031700000ThqzkAAB</sf:Id> 
         </records> 
         <size>1</size> 
        </sf:Contacts> 
        <sf:Opportunities xsi:type="QueryResult"> 
         <done>true</done> 
         <queryLocator xsi:nil="true"/> 
         <records xsi:type="sf:sObject"> 
          <sf:type>Opportunity</sf:type> 
          <sf:Id>0061700000BB1kRAAT</sf:Id> 
          <sf:Id>0061700000BB1kRAAT</sf:Id> 
         </records> 
         <size>1</size> 
        </sf:Opportunities> 
       </records> 
       ***<records xsi:type="sf:sObject"> 
        <sf:type>Account</sf:type> 
        <sf:Id xsi:nil="true"/> 
        <sf:Contacts xsi:type="QueryResult"> 
         <done>true</done> 
         <queryLocator xsi:nil="true"/> 
         <records xsi:type="sf:sObject"> 
          <sf:type>Contact</sf:type> 
          <sf:Id>0031a00000Kdu8zAAB</sf:Id> 
          <sf:Id>0031a00000Kdu8zAAB</sf:Id> 
         </records> 
         <size>1</size> 
        </sf:Contacts> 
        <sf:Opportunities xsi:type="QueryResult"> 
         <done>true</done> 
         <queryLocator xsi:nil="true"/> 
         <records xsi:type="sf:sObject"> 
          <sf:type>Opportunity</sf:type> 
          <sf:Id>0061a00000Ej6JwAAJ</sf:Id> 
          <sf:Id>0061a00000Ej6JwAAJ</sf:Id> 
         </records> 
         <size>1</size> 
        </sf:Opportunities> 
       </records> 
       <records xsi:type="sf:sObject"> 
        <sf:type>Account</sf:type> 
        <sf:Id xsi:nil="true"/> 
        <sf:Contacts xsi:type="QueryResult"> 
         <done>true</done> 
         <queryLocator xsi:nil="true"/> 
         <records xsi:type="sf:sObject"> 
          <sf:type>Contact</sf:type> 
          <sf:Id>0031a00000HcNSDAA3</sf:Id> 
          <sf:Id>0031a00000HcNSDAA3</sf:Id> 
         </records> 
         <size>1</size> 
        </sf:Contacts> 
        <sf:Opportunities xsi:type="QueryResult"> 
         <done>true</done> 
         <queryLocator xsi:nil="true"/> 
         <records xsi:type="sf:sObject"> 
          <sf:type>Opportunity</sf:type> 
          <sf:Id>0061a00000Ej6JDAAZ</sf:Id> 
          <sf:Id>0061a00000Ej6JDAAZ</sf:Id> 
         </records> 
         <size>1</size> 
        </sf:Opportunities> 
       </records>*** 
       <size>3</size> 
      </result> 
     </queryResponse> 
    </soapenv:Body></soapenv:Envelope> 

Ниже приведен код XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:ns="urn:partner.soap.sforce.com" 
    xmlns:sf="urn:sobject.partner.soap.sforce.com" 
    xmlns:sfdc="sfdc"> 
    <xsl:template match="/"> 
     <sfdc:sObjects xmlns:sfdc="sfdc" type="OpportunityContactRole"> 
      <xsl:for-each select="//ns:queryResponse/ns:result/ns:records"> 
       <xsl:if test="//ns:records/sf:Contacts/ns:done/text() = 'true' and //ns:records/sf:Opportunities/ns:done/text() = 'true'"> 
       <sfdc:sObject> 
        <sfdc:ContactId> 
         <xsl:value-of select="//ns:records/sf:Contacts/ns:records/sf:Id[1]/text()"/> 
        </sfdc:ContactId> 
        <sfdc:IsPrimary>True</sfdc:IsPrimary> 
        <OpportunityId> 
         <xsl:value-of select="//ns:records/sf:Opportunities/ns:records/sf:Id[1]/text()"/> 
        </OpportunityId> 
        <sfdc:Role>Purchaser</sfdc:Role> 
       </sfdc:sObject> 
       </xsl:if> 
      </xsl:for-each> 
     </sfdc:sObjects> 
    </xsl:template> 
</xsl:stylesheet> 

ниже выход, который я получил

<?xml version="1.0" encoding="utf-8"?> 
<sfdc:sObjects xmlns:sfdc="sfdc" xmlns:ns="urn:partner.soap.sforce.com" 
    xmlns:sf="urn:sobject.partner.soap.sforce.com" type="OpportunityContactRole"> 
    <sfdc:sObject> 
     <sfdc:ContactId>0031700000ThqzkAAB</sfdc:ContactId> 
     <sfdc:IsPrimary>True</sfdc:IsPrimary> 
     <OpportunityId>0061700000BB1kRAAT</OpportunityId> 
     <sfdc:Role>Purchaser</sfdc:Role> 
    </sfdc:sObject> 
    <sfdc:sObject> 
     <sfdc:ContactId>0031700000ThqzkAAB</sfdc:ContactId> 
     <sfdc:IsPrimary>True</sfdc:IsPrimary> 
     <OpportunityId>0061700000BB1kRAAT</OpportunityId> 
     <sfdc:Role>Purchaser</sfdc:Role> 
    </sfdc:sObject> 
    <sfdc:sObject> 
     <sfdc:ContactId>0031700000ThqzkAAB</sfdc:ContactId> 
     <sfdc:IsPrimary>True</sfdc:IsPrimary> 
     <OpportunityId>0061700000BB1kRAAT</OpportunityId> 
     <sfdc:Role>Purchaser</sfdc:Role> 
    </sfdc:sObject> 
</sfdc:sObjects> 

здесь выведенный выше результат, итерация происходит успешно, но считаются только первые значения записей i.e 0031700000ThqzkAAB и 0061700000BB1kRAAT

Почему второе и третье значения записи (выделенные во входном xml) существуют на выходе.? не в состоянии понять.

в целом ниже желаемый результат

<?xml version="1.0" encoding="utf-8"?> 
<sfdc:sObjects xmlns:sfdc="sfdc" xmlns:ns="urn:partner.soap.sforce.com" 
    xmlns:sf="urn:sobject.partner.soap.sforce.com" type="OpportunityContactRole"> 
    <sfdc:sObject> 
     <sfdc:ContactId>0031700000ThqzkAAB</sfdc:ContactId> 
     <sfdc:IsPrimary>True</sfdc:IsPrimary> 
     <OpportunityId>0061700000BB1kRAAT</OpportunityId> 
     <sfdc:Role>Purchaser</sfdc:Role> 
    </sfdc:sObject> 
    <sfdc:sObject> 
     <sfdc:ContactId>0031a00000Kdu8zAAB</sfdc:ContactId> 
     <sfdc:IsPrimary>True</sfdc:IsPrimary> 
     <OpportunityId>0061a00000Ej6JwAAJ</OpportunityId> 
     <sfdc:Role>Purchaser</sfdc:Role> 
    </sfdc:sObject> 
    <sfdc:sObject> 
     <sfdc:ContactId>0031a00000HcNSDAA3</sfdc:ContactId> 
     <sfdc:IsPrimary>True</sfdc:IsPrimary> 
     <OpportunityId>0061a00000Ej6JDAAZ</OpportunityId> 
     <sfdc:Role>Purchaser</sfdc:Role> 
    </sfdc:sObject> 
</sfdc:sObjects> 

с просьбой, пожалуйста, помогите мне выход

ответ

0

Когда вы находитесь внутри вашего xsl:for-each, контекст //ns:queryResponse/ns:result/ns:records.

Когда вы делаете свой xsl:value-of, вы начинаете свой выбор с //, который начинается с начала документа. Попробуйте делая выбор относительно текущего контекста ...

<xsl:template match="/"> 
    <sfdc:sObjects xmlns:sfdc="sfdc" type="OpportunityContactRole"> 
     <xsl:for-each select="//ns:queryResponse/ns:result/ns:records"> 
     <xsl:if test="sf:Contacts/ns:done = 'true' and sf:Opportunities/ns:done = 'true'"> 
      <sfdc:sObject> 
      <sfdc:ContactId> 
       <xsl:value-of select="sf:Contacts/ns:records/sf:Id[1]"/> 
      </sfdc:ContactId> 
      <sfdc:IsPrimary>True</sfdc:IsPrimary> 
      <OpportunityId> 
       <xsl:value-of select="sf:Opportunities/ns:records/sf:Id[1]"/> 
      </OpportunityId> 
      <sfdc:Role>Purchaser</sfdc:Role> 
      </sfdc:sObject> 
     </xsl:if> 
     </xsl:for-each> 
    </sfdc:sObjects> 
    </xsl:template> 

Edit: Вы должны также сделать XPaths в xsl:if относительно текущего контекста. Обновлен шаблон выше.

Вы также можете переместить тест предиката в xsl:for-each и удалить xsl:if полностью ...

+0

Спасибо за решение, это сработало для меня – user2587669

0

Измените ваш XPath: //ns:records/sf:Contacts/ns:records/sf:Id[1]/text() удалить //ns:records

Так что это будет просто sf:Contacts/ns:records/sf:Id[1]/text()

и

//ns:records/sf:Opportunities/ns:records/sf:Id[1]/text() до sf:Opportunities/ns:records/sf:Id[1]/text()

+0

Спасибо за решение, это сработало для меня – user2587669

Смежные вопросы