在 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() = 1
或 position() = 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>
我正在从 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() = 1
或 position() = 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>