2013-07-02 127 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