JDeveloper中的For-each循环根本不映射响应

时间:2013-08-13 17:21:37

标签: xslt jdeveloper bpel

我正在使用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>

enter image description here

但是响应没有映射到这个xsl。我不确定我是否犯了任何语法错误或者是否缺少任何命名空间。

任何形式的指导都会很棒!

1 个答案:

答案 0 :(得分:0)

我不确定我是否犯了任何语法错误或者是否缺少任何命名空间。

我认为这两次都是正确的。

首先是语法错误。

如果带有“xsl code is”字样的XML实际上是整个样式表,那么你的第一个语法错误就是你的样式表不是命名空间良好的形式:你没有声明任何名称空间前缀{ {1}},ns2ns3

您的第二个语法错误是在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)与任何内容都不匹配。这两个路径表达式都粗略地说:

  1. 从文档的根目录开始(即/tns:Subscriber_WalletInfo_GetResponse/Data/Item)。
  2. 最外面的元素将在绑定到前缀/tns:Subscriber_WalletInfo_GetResponse/ErrorDescription的命名空间中命名为/
  3. 在该元素中,第二个选择表达式搜索名称为Subscriber_WalletInfo_GetResponse的子元素,该子元素不是名称空间限定的。第一个表达式搜索名为tns的子项(或:所有子项的集合),然后在数据元素中搜索名为ErrorDescription的所有子项的集合,并评估其中的内容每个指令一次为每个指令。元素DataItem都应该是名称空间不合格的。
  4. 相比之下,在您显示的数据中,最外层元素未命名为Item,并且不符合命名空间。当然,select表达式都不匹配任何东西:它们都在第2步失败。