0

我正在使用 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 映射。我不确定我是否犯了任何语法错误或是否缺少任何命名空间。

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

4

1 回答 1

0

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

两次都对,我想。

首先,语法错误。

如果用“The xsl code is”字样引入的 XML 实际上是整个样式表,那么您的第一个语法错误是您的样式表不是命名空间格式正确的:您没有声明任何命名空间前缀ns2ns3xsl

您的第二个语法错误是在 XSLT 级别:命名空间前缀tns也没有声明。

您的第三个语法错误是最外层元素不包含任何 xsl:version 属性。

当我为未绑定的前缀(和http://www.w3.org/1999/XSL/Transform前缀xsl)提供虚拟命名空间声明并在最外层元素上提供 xsl:version="1.0" 属性时,样式表将成为合法的 XSLT 1.0 样式表,使用“文字结果元素作为样式表” “ 选项。

语法错误就这么多。当我在您提供的输入上运行修复后的样式表时,我得到了输出。不是你想要的输出,而是进步:

<?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/Itemand /tns:Subscriber_WalletInfo_GetResponse/ErrorDescription)不匹配任何内容。这两个路径表达式都大致说:

  1. 从文档的根目录开始(即/)。
  2. Subscriber_WalletInfo_GetResponse在绑定到前缀的命名空间中,最外层的元素将被命名tns
  3. 在该元素中,第二个选择表达式搜索一个名为的子元素,该子元素ErrorDescription不是命名空间限定的。第一个表达式搜索名为 的子项(或:所有子项的集合)Data,然后在 Data 元素中搜索所有名为 的子项的集合Item,并为每个子项计算一次 for-each 指令的内容. 元素ItemData都应该是命名空间不合格的。

相比之下,在您显示的数据中,最外面的元素没有命名Subscriber_WalletInfo_GetResponse,也没有命名空间限定。自然,两个 select 表达式都不匹配任何内容:它们都在第 2 步失败。

于 2013-08-13T21:40:32.413 回答