我有一个场景,我将把一个参数传递给XSLT,XSLT又是一个xml元素。但它将作为一个逃跑的charecters(<for<….)发送
我的要求是,我在其中有各种子节点,在这些子节点中我必须循环遍历它们并需要转换。请查找请求,参数。
请求.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 ">
<statusCode>0</statusCode>
<errorMessage>errorMessage</errorMessage>
<paymentMethodTypes>
<!-- NULL or any type code 01, 04 , 10 (sample not real) -->
<methodTypeCode>01</methodTypeCode>
<!-- Possible values methodTypeDisplayName
CREDIT_CARD,BANK_ACCOUNT,CASH,CHECK,CASH_EQUIVALENT
-->
<methodTypeDisplayName>CREDIT_CARD</methodTypeDisplayName>
<!-- valid dollar amount -->
<maximumAmountPaid>100.00</maximumAmountPaid>
</paymentMethodTypes>
<paymentFormInfo>
<!-- NULL or any type code 01, 04 , 10 (sample not real) -->
<paymentMethodTypeCode>01</paymentMethodTypeCode>
<!-- sample form id 1004854 , 1004874 , 1004889 , 1004875-->
<formId>1004885</formId>
<!-- Not exactly sure just an assumption -->
<formLanguageRefId>US</formLanguageRefId>
<!-- forn name : EFT_AUTHORIZATION -->
<formName>EFT_AUTHORIZATION</formName>
<roleActivity>
<agentActivity>
<inOfficeRulesForActivity>
<!-- for Agent : REVIEW_PRINT, ESIGN , UPLOAD
for customer : CHECKBOX -->
<customerActivity>REVIEW_PRINT</customerActivity>
<customerRole>PAYOR</customerRole>
</inOfficeRulesForActivity>
<outOfOfficeRulesForActivity>
<customerActivity>CHECKBOX</customerActivity>
<customerRole>PAYOR</customerRole>
</outOfOfficeRulesForActivity>
</agentActivity>
<commonActivity>
<roleCategory>ONLINE</roleCategory>
<roleForActivity>
<customerActivity>ESIGN</customerActivity>
<customerRole>PAYOR</customerRole>
</roleForActivity>
</commonActivity>
</roleActivity>
</paymentFormInfo>
<financialAccountOwnerActivity>
<canChange>true</canChange>
<!-- valid String -->
<searchOptions>searchOptions</searchOptions>
</financialAccountOwnerActivity>
<canChooseAgent>true</canChooseAgent>
</b>
问题:在这里,大多数复杂元素为零或更多。我需要循环浏览所有元素。但如果我们有如上所示的参数,那就很困难了。我们不能为每个或任何其他有效的xpath求值实现,因为在参数中我们有xs:String。xsl:param(或)xsl:copy 中的每个元素(或)任何有效的xpath求值是否有循环的方法
感谢的任何帮助
谢谢Eresh
根据我的经验,最简单的方法是:
- 将参数放入XML文档中;给它一个名字(比如
param.xml
) - 从命令行调用XSLT处理器时,将参数文件的名称作为字符串参数传递
- 在XSLT中,声明适当的参数(例如
<xsl:param name="paramfile" select="'param.xml'"/>
) - 声明一个初始化为
document($paramfile)
的变量
如果您从其他环境调用XSLT(例如,通过Java调用),可能会有一些机制将文档节点或元素节点作为参数传递给XSLT处理器,但细节必须是特定于实现的,而且(根据SO上的问题判断)很容易出错。
我正在上传mule代码和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代码:
<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的转换器将字符串转换为DOM,我们可以指定返回类第一个子项将为我们提供元素句柄,并且我们将其传递给XSL