在 soa BPEL 中将 for-each 循环中的计数器变量用于 XSLT

Use the counter variable from a for-each loop into an XSLT in soa BPEL

我正在从 BPEL 流程调用 Web 服务。网络服务接受以下参数:

<xsd:element name="Documents" minOccurs="0" nillable="true"
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element name="Entry" minOccurs="0" nillable="true" maxOccurs="unbounded">
      <xsd:complexType>
    <xsd:sequence>
<xsd:element name="url" minOccurs="0" nillable="true" type="xsd:string
<xsd:element name="ID" minOccurs="0" nillable="true" type="xsd:string" >
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

我收到的请求有多个条目。所以我正在使用 <for-each> 循环。 <for-each> 循环计算存在的条目数并根据计数循环。例如,如果我有 3 个条目,<for-each> 循环会调用 web 服务三次(这就是我想要的)。

但每次调用时,它只传递第一个条目。 在调用网络服务之前,我使用了一个转换 activity 和一个 XSLT。我想以这样一种方式定义 XSLT,它将调用当前计数值。

例如:

if count = 1.. entry 1 is transformed
If count = 2.. entry 2 is transformed.

我坚持使用的 XSLT 如下:我正在使用 position 函数并想将其分配给 count 变量。 当我硬编码 position() = 1position() = 2 之类的代码时,它工作正常并提取我需要的条目。但是我如何在运行时设置它?

使用 position() 是正确的选项还是我可以使用其他选项?

注意: 计数最初是在启动 <for-each> 循环时定义的,我根据条目进行设置。

很抱歉这么长的问题,但我希望有人能回答。

提前致谢

<tns:Documents>
<xsl:for-each       select="/ns0:request/ns0:Documents/ns0:Entry[position()==?????]">    
<tns:Entry>
<tns:Url>
<xsl:value-of select="ns0:Url"/>
</tns:Url>
<tns:ID>
<xsl:value-of select="ns0:ID"/>
</tns:ID>
</tns:Entry>
</xsl:for-each>
</tns:Documents>

您的 XSD 文件格式不正确。我没有编辑你关于这个问题的问题,因为它会破坏你提出问题的原因。

所以在这里,我纠正了你问题的一些缺陷:这是良好形成你输入的结果:

<xsd:element name="Documents" minOccurs="0" nillable="true">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="Entry" minOccurs="0" nillable="true" maxOccurs="unbounded">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="url" minOccurs="0" nillable="true" type="xsd:string" />
                        <xsd:element name="ID" minOccurs="0" nillable="true" type="xsd:string" />
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

您的格式正确的 XSLT 如下所示:

<tns:Documents>
    <xsl:for-each select="/ns0:request/ns0:Documents/ns0:Entry[position()==?????]">    
        <tns:Entry>
            <tns:Url>
                <xsl:value-of select="ns0:Url"/>
            </tns:Url>
            <tns:ID>
                <xsl:value-of select="ns0:ID"/>
            </tns:ID>
        </tns:Entry>
    </xsl:for-each>
</tns:Documents>

这些是事实。到目前为止,您还没有提供扩展的 XSLT 来将这两个数据集转换为任何解决此问题的方法。提供 XSL 来解决您的问题是有建设性的,您不觉得吗? :-)

为什么要在 xsl:for-each/@select 属性上使用(或:尝试使用)position()

您有三个请求。对于每个请求,您都希望调用 Web 服务。在伪代码中,你想要的结构是

<xsl:for-each select="path/to/all/my-requests">
  <!--* invoke web service ... *-->
</xsl:for-each>