Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle服务总线-分配表达式_Oracle_Xslt_Transform_Soa_Osb - Fatal编程技术网

Oracle服务总线-分配表达式

Oracle服务总线-分配表达式,oracle,xslt,transform,soa,osb,Oracle,Xslt,Transform,Soa,Osb,我有这个问题,我不知道为什么会发生,如何解决它。我已经创建了一个OSB项目。在代理服务管道中,我正在对另一个应用程序中的同步SOAP服务进行服务调用。其他服务需要请求主体,如下所示: <RequestSelectionValues xmlns="http://www.camstar.com/WebService/WSShopFloor"> <inputServiceData xmlns:q1="http://www.camstar.com/WebSe

我有这个问题,我不知道为什么会发生,如何解决它。我已经创建了一个OSB项目。在代理服务管道中,我正在对另一个应用程序中的同步SOAP服务进行服务调用。其他服务需要请求主体,如下所示:

  <RequestSelectionValues xmlns="http://www.camstar.com/WebService/WSShopFloor">
            <inputServiceData xmlns:q1="http://www.camstar.com/WebService/DataTypes" q1:type="OnlineQuery">
                <OnlineQuerySetup>
                    <__CDOTypeName/>
                    <__name>xLot By FabLotNumber</__name>
                </OnlineQuerySetup>
                <Parameters>
                    <__listItem>
                        <Name>FabLotNumber</Name>
                        <DefaultValue>FAB_Lot_1</DefaultValue>
                    </__listItem>
                    <__listItem>
                        <Name>BLOCKOF200ROWS</Name>
                        <DefaultValue>1</DefaultValue>
                    </__listItem>
                </Parameters>
            </inputServiceData>
   <queryOption xmlns:q2="http://www.camstar.com/WebService/DataTypes" q2:type="QueryOption">
    <RowSetSize>1000</RowSetSize>
    <StartRow>1</StartRow>
    <QueryType>user</QueryType>
    <ChangeCount>0</ChangeCount>
    <RequestRecordCount>false</RequestRecordCount>
    <RequestRecordSetAndCount>false</RequestRecordSetAndCount>
   </queryOption>
            <serviceInfo xmlns:q3="http://www.camstar.com/WebService/DataTypes" q3:type="OnlineQuery_Info">
                <OnlineQuerySelection>
                    <RequestValue>false</RequestValue>
                    <RequestMetadata>false</RequestMetadata>
                    <RequestSubFieldValues>false</RequestSubFieldValues>
                    <RequestSelectionValues>true</RequestSelectionValues>
                </OnlineQuerySelection>
            </serviceInfo>
  </RequestSelectionValues>

按FabLotNumber计算的xLot
FabLotNumber
工厂地块1
200行的区块
1.
1000
1.
用户
0
假的
假的
假的
假的
假的
真的
我使用赋值将上述表达式放入变量中

注意这一行:

<serviceInfo xmlns:q3="http://www.camstar.com/WebService/DataTypes" q3:type="OnlineQuery_Info">

xmlns:q3=”http://www.camstar.com/WebService/DataTypes“需要在q3之前:type=“OnlineQuery\u Info”才能成功调用其他服务,否则服务调用将失败

在开发过程中,它看起来不错。我也可以测试表达式的赋值

当我转到OSB控制台测试该服务时,我注意到在Assign变量中,名称空间place发生了切换,如下所示:

<serviceInfo q3:type="OnlineQuery_Info" xmlns:q3="http://www.camstar.com/WebService/DataTypes">

这使得服务调用失败。我已经尝试将主体负载放入xslt中。结果是一样的。我不知道为什么它会在名称空间之前切换类型。最终结果是服务没有按预期工作

你知道我能做些什么来解决这个问题吗。如何防止切换


谢谢

我在OSB中找不到任何可以阻止为您重新排序属性的设置。但是,上述OSB行为完全符合XML标准。事实上,目标服务端应该是XML兼容的,并将上面提到的两个变体视为相同的,因为根据XML标准,只有属性顺序不同的两个XML文档应该被视为相同的

编辑: 请转到下载修改后的配置。我的想法是:

  • 指定要在“文本作为请求”模式下调用的业务服务,如下面所示的“CamstarLotQuery/business/CSWSShopFloor_Txt”:
  • 按照“CamstarLotQuery/proxy/CamstarlotQueryText_Txt”中的规定,在代理服务中将消息作为文本而不是XML进行操作:
  • 调用业务服务时,可能需要在http头中指定SOAP操作,具体取决于目标服务

  • 我能想到的一个解决方案是在父标记级别分配所有名称空间,并将属性保留在适用的位置

    例如:

    <RequestSelectionValues xmlns:q1="http://www.camstar.com/WebService/DataTypes" xmlns="http://www.camstar.com/WebService/WSShopFloor" xmlns:q2="http://www.camstar.com/WebService/DataTypes" xmlns:q3="http://www.camstar.com/WebService/DataTypes">
    
    
    
    但是这个实现的问题是,由于名称空间声明现在是全局的,所以必须向先前定义名称空间的块声明名称空间前缀(q1、q2、q3)

    例如:

    <q3:serviceInfo q3:type="OnlineQuery_Info">
       <q3:OnlineQuerySelection>
          <q3:RequestValue>false</q3:RequestValue>
          <q3:RequestMetadata>false</q3:RequestMetadata>
          <q3:RequestSubFieldValues>false</q3:RequestSubFieldValues>
          <q3:RequestSelectionValues>true</q3:RequestSelectionValues>
       </q3:OnlineQuerySelection>
    </q3:serviceInfo>
    
    
    假的
    假的
    假的
    真的
    
    如果未声明此名称空间前缀,则根据XML标准,标记将采用“default”名称空间值,这将是父级的名称空间


    但是,即使此解决方案有一个循环的实现方式,此解决方案肯定会起作用。

    我同意您的意见,但目标服务不接受这两个变体。不可能在该应用程序中更改任何内容。它安装在室内,但没有任何定制。无法更改Web服务。如果这是OSB的正常行为,那么我恐怕被卡住了,无法继续:(我尝试在OSB外部使用XSLT,但效果与预期一样,属性不会切换,但一旦在OSB中使用XSLT,其切换和服务调用就会失败。如果使用XML,则无法保证属性排序和名称空间前缀等功能。如果目标服务真的以这种方式工作,我建议您尝试在ext’模式而不是XML。更准确地说,我认为您可以尝试将XML作为响应,而将文本作为请求,OSB在处理您的请求消息时没有XML的概念,因此不会更改您的请求消息中的任何内容。如果您和您的团队觉得这有点奇怪,您可以将此“奇怪”逻辑放在单独的代理/业务服务中,以便整体解决方案看起来更干净。您认为呢?您好,它甚至不能与文本一起工作。一旦我将请求分配给变量,它就会切换属性。这个问题确实困扰着我。我已经联系了Oracle支持部门,但到目前为止还没有解决方案。如果我听到任何反馈,我会通知您。