我正在使用JDeveloper 11.1.1.5.0开发BPEL服务。
API的响应包含一些重复的字段,我正在尝试使用for-each循环将它们映射到最终的Web服务的响应参数。
API的响应结构如下:
<Data>
<Item>
<F6181_SubsWalletCounter>-1</F6181_SubsWalletCounter>
<FBalanceExpDate>2013-08-13T00:00:00</FBalanceExpDate>
<FResetWalletCounterValue>0</FResetWalletCounterValue>
<FRecurringPeriod>0</FRecurringPeriod>
<FRecurringRefreshDate>1899-12-30T00:00:00</FRecurringRefreshDate>
<FRecurringRefreshDay>0</FRecurringRefreshDay>
<F6150_AccountProfileId>18</F6150_AccountProfileId>
<FLimit>0</FLimit>
<F8345_PaymentDebt>0</F8345_PaymentDebt>
<F9217_MinBalance>0</F9217_MinBalance>
<F9218_MaxPaymentDebt>-1</F9218_MaxPaymentDebt>
</Item>
<Item>
<F6181_SubsWalletCounter>-1</F6181_SubsWalletCounter>
<FBalanceExpDate>2013-08-13T00:00:00</FBalanceExpDate>
<FResetWalletCounterValue>0</FResetWalletCounterValue>
<FRecurringPeriod>0</FRecurringPeriod>
<FRecurringRefreshDate>1899-12-30T00:00:00</FRecurringRefreshDate>
<FRecurringRefreshDay>0</FRecurringRefreshDay>
<F6150_AccountProfileId>18</F6150_AccountProfileId>
<FLimit>0</FLimit>
<F8345_PaymentDebt>0</F8345_PaymentDebt>
<F9217_MinBalance>0</F9217_MinBalance>
<F9218_MaxPaymentDebt>-1</F9218_MaxPaymentDebt>
</Item>
</Data>
<Item>
元素及其子元素可以重复多次,保持其内部的确切结构。在这些子元素中,很少用最终响应参数进行映射。
xsl代码是:
<ns2:responseBody>
<ns2:balanceInfo>
<ns2:balance>
<xsl:for-each select=
"/tns:Subscriber_WalletInfo_GetResponse/Data/Item">
<ns2:wallet>
<xsl:value-of select="F6091_WalletTypeName"/>
</ns2:wallet>
</xsl:for-each>
<ns2:expirationDate>
<xsl:value-of select="FBalanceExpDate"/>
</ns2:expirationDate>
<ns2:balanceAmount>
<xsl:value-of select="F9261_Balance"/>
</ns2:balanceAmount>
<ns2:unit>
<xsl:value-of select="F8341_CurrencyName"/>
</ns2:unit>
</ns2:balance>
</ns2:balanceInfo>
<ns3:Error>
<ns3:description>
<xsl:value-of select="/tns:Subscriber_WalletInfo_GetResponse/ErrorDescription"/>
</ns3:description>
</ns3:Error>
</ns2:responseBody>
但是响应没有映射到这个xsl。我不确定我是否犯了任何语法错误或者是否缺少任何命名空间。
任何形式的指导都会很棒!
答案 0 :(得分:0)
我不确定我是否犯了任何语法错误或者是否缺少任何命名空间。
我认为这两次都是正确的。
首先是语法错误。
如果带有“xsl code is”字样的XML实际上是整个样式表,那么你的第一个语法错误就是你的样式表不是命名空间良好的形式:你没有声明任何名称空间前缀{ {1}},ns2
,ns3
。
您的第二个语法错误是在XSLT级别:名称空间前缀xsl
也未声明。
您的第三个语法错误是最外层元素不包含任何xsl:version属性。
当我为未绑定的前缀(和前缀tns
的{{1}})提供虚拟名称空间声明并在最外层元素上提供xsl:version =“1.0”属性时,样式表变为合法的XSLT 1.0样式表,使用“文字结果元素作为样式表”选项。
语法错误太多了。当我在你提供的输入上运行修复的样式表时,我得到了输出。不是你想要的输出,而是它的进步:
http://www.w3.org/1999/XSL/Transform
现在是语义错误,包括但不限于命名空间错误。
您在此处未获得有关输入的任何信息,因为样式表中的xsl
表达式(特别是<?xml version="1.0"?>
<ns2:responseBody xmlns:ns2="http://example.com/ns2"
xmlns:ns3="http://example.com/ns3"
xmlns:tns="http://example.com/tns">
<ns2:balanceInfo>
<ns2:balance>
<ns2:expirationDate/>
<ns2:balanceAmount/>
<ns2:unit/>
</ns2:balance>
</ns2:balanceInfo>
<ns3:Error>
<ns3:description/>
</ns3:Error>
</ns2:responseBody>
和select
)与任何内容都不匹配。这两个路径表达式都粗略地说:
/tns:Subscriber_WalletInfo_GetResponse/Data/Item
)。/tns:Subscriber_WalletInfo_GetResponse/ErrorDescription
的命名空间中命名为/
。Subscriber_WalletInfo_GetResponse
的子元素,该子元素不是名称空间限定的。第一个表达式搜索名为tns
的子项(或:所有子项的集合),然后在数据元素中搜索名为ErrorDescription
的所有子项的集合,并评估其中的内容每个指令一次为每个指令。元素Data
和Item
都应该是名称空间不合格的。相比之下,在您显示的数据中,最外层元素未命名为Item
,并且不符合命名空间。当然,select表达式都不匹配任何东西:它们都在第2步失败。