2013-07-02 97 views
0

我有一個場景,我將在這裏傳遞一個參數給XSLT,而後者又是一個xml元素。但它會作爲逃生模板發送(<爲< ....)將xsl參數轉換爲xml節點,以便通過各種節點lopp

我的要求是我有各種各樣的孩子節點,我必須通過它們循環並需要變換。請找到請求,參數。

Request.xml

 <retrievePaymentMethodsRequest> 
     <!--Optional:--> 
     <retrievePaymentMethodsRequestTO> 
    <financialAccountID>3</financialAccountID> 
      <bankCountryCode>1</bankCountryCode> 
      <clientID>12345</clientID> 
      <!--Optional:--> 
      <device>003</device> 
      <excludedLifeIndicator>003</excludedLifeIndicator> 

      <financialAccountStatus>3</financialAccountStatus> 
      <kindCode>003</kindCode> 
      <notEndedIndicator>0</notEndedIndicator> 
      <!--Optional:--> 
      <requestMode>003</requestMode> 
      <stateCode>003</stateCode> 
     </retrievePaymentMethodsRequestTO> 
    </retrievePaymentMethodsRequest> 

參數XSLT:

<b xmlns:fs2="somescheama" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:fga="anyvalue"> xmlns:fs2="any value" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="any location "&gt; 
          &lt;statusCode&gt;0&lt;/statusCode&gt; 
          &lt;errorMessage&gt;errorMessage&lt;/errorMessage&gt; 
          &lt;paymentMethodTypes&gt; 
          &lt;!-- NULL or any type code 01, 04 , 10 (sample not real) --&gt; 
          &lt;methodTypeCode&gt;01&lt;/methodTypeCode&gt; 
          &lt;!-- Possible values methodTypeDisplayName 
           CREDIT_CARD,BANK_ACCOUNT,CASH,CHECK,CASH_EQUIVALENT 
          --&gt; 
          &lt;methodTypeDisplayName&gt;CREDIT_CARD&lt;/methodTypeDisplayName&gt; 
          &lt;!-- valid dollar amount --&gt; 
          &lt;maximumAmountPaid&gt;100.00&lt;/maximumAmountPaid&gt; 
          &lt;/paymentMethodTypes&gt; 
          &lt;paymentFormInfo&gt; 
          &lt;!-- NULL or any type code 01, 04 , 10 (sample not real) --&gt; 
          &lt;paymentMethodTypeCode&gt;01&lt;/paymentMethodTypeCode&gt; 
          &lt;!-- sample form id 1004854 , 1004874 , 1004889 , 1004875--&gt; 
          &lt;formId&gt;1004885&lt;/formId&gt; 
          &lt;!-- Not exactly sure just an assumption --&gt; 
          &lt;formLanguageRefId&gt;US&lt;/formLanguageRefId&gt; 
          &lt;!-- forn name : EFT_AUTHORIZATION --&gt; 
          &lt;formName&gt;EFT_AUTHORIZATION&lt;/formName&gt; 
          &lt;roleActivity&gt; 
           &lt;agentActivity&gt; 
           &lt;inOfficeRulesForActivity&gt; 
            &lt;!-- for Agent : REVIEW_PRINT, ESIGN , UPLOAD 
             for customer : CHECKBOX --&gt; 
            &lt;customerActivity&gt;REVIEW_PRINT&lt;/customerActivity&gt; 
            &lt;customerRole&gt;PAYOR&lt;/customerRole&gt; 
           &lt;/inOfficeRulesForActivity&gt; 
           &lt;outOfOfficeRulesForActivity&gt; 
            &lt;customerActivity&gt;CHECKBOX&lt;/customerActivity&gt; 
            &lt;customerRole&gt;PAYOR&lt;/customerRole&gt; 
           &lt;/outOfOfficeRulesForActivity&gt; 
           &lt;/agentActivity&gt; 
           &lt;commonActivity&gt; 
           &lt;roleCategory&gt;ONLINE&lt;/roleCategory&gt; 
           &lt;roleForActivity&gt; 
            &lt;customerActivity&gt;ESIGN&lt;/customerActivity&gt; 
            &lt;customerRole&gt;PAYOR&lt;/customerRole&gt; 
           &lt;/roleForActivity&gt; 
           &lt;/commonActivity&gt; 
          &lt;/roleActivity&gt; 
          &lt;/paymentFormInfo&gt; 
          &lt;financialAccountOwnerActivity&gt; 
          &lt;canChange&gt;true&lt;/canChange&gt; 
          &lt;!-- valid String --&gt; 
          &lt;searchOptions&gt;searchOptions&lt;/searchOptions&gt; 
          &lt;/financialAccountOwnerActivity&gt; 
          &lt;canChooseAgent&gt;true&lt;/canChooseAgent&gt; 
         </b> 

問題: 這裏大多數複合元件是零個或多個。我需要遍歷所有元素。但是如果我們有如上所示的參數,則很難。我們不能實現for-each或任何其他有效的xpath評估,因爲在參數中我們有xs:String。有沒有辦法通過每個元素(或)XSL中循環的任何有效的XPath評價:參數(或)XSL:複製

任何幫助表示讚賞

感謝 Eresh

回答

0

以我的經驗,最簡單的方法是:

  • 將參數放入XML文檔中;給它一個名字(比如說,param.xml)。
  • 從命令行調用XSLT處理器時,請將參數文件的名稱作爲字符串參數傳遞。
  • 在XSLT中,聲明適當的參數(例如<xsl:param name="paramfile" select="'param.xml'"/>)。
  • 聲明一個初始化爲document($paramfile)的變量。

如果你從其他一些環境中(例如,通過Java調用)調用XSLT,有可能是用於傳遞文檔節點或元素節點的XSLT處理器作爲參數的機制,但細節一定是實現特定的和(根據SO的問題來判斷)往往很容易出錯。

+0

感謝您的回覆,但我們無法將外部文件解析用作xslt中的文檔並使用。我們使用mule esb,我們所有來自騾子的有效載荷將被髮送到xslt進行轉換。如果我們將任何參數從mule發送到xslt,即使它是一個xml元素,所有小於和大於符號的wuth都會被替換爲wuth轉義字符,但我們正是儘可能將cdata傳遞給xslt,即使我們將xml傳遞給它。 – Eresh

+0

我們也試過在mule esb中使用java評估來傳遞參數,但沒有幫助。我們得到了#[document:null]。 – Eresh

+0

聽起來好像您有兩個XML流交給XSLT處理器。如果你不能讓它們中的任何一個都可以從一個URI中獲取(n.b. *,*不一定與'從一個文件中'相同),另一種方法是將它們都包裝到一個包裝文檔中並相應地調整XSLT。在XSLT 2.0中編寫XML解析器(或使用擴展函數將字符串解析爲XML)將是最後的手段。祝你好運。 –

0

我上傳騾子代碼以及XSLT哪裏我送參數作爲文件

XSLT文件

<xsl:template match="/"> 
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
     xmlns:ser="http://service.moneytransfermanagement.financials.icp.sf/"> 
     <soapenv:Body> 
      <soapenv:Fault> 
       <faultcode> 
        <xsl:copy-of select="$xmlObj/node()"/> 
       <!-- 
       <xsl:copy-of select="//$xmlObj/errorCode"/> 
       --> 
       </faultcode> 
       <faultstring>      

       </faultstring>        
       <detail> 

       </detail> 
       </soapenv:Fault>     
     </soapenv:Body> 
    </soapenv:Envelope>  
</xsl:template> 

和騾子代碼:

<mule-xml:xslt-transformer 
     xsl-file="xsl/MoneyTransferManagement/ErrorTransformerXMLTest.xsl"> 
     <mule-xml:context-property key="xmlObj" 
      value="#[groovy:serviceResponse.getFirstChild()]" />       
    </mule-xml:xslt-transformer> 

XML到DOM變壓器將CONVER字符串到DOM,我們可以指定返回類 第一個孩子會給我們的元素手柄,,並同我們傳遞到XSL