我的要求如下。 EmpNumberList将按空格分隔250个EmpNumber。
<soapenv:Body>
<v1:MRRequestParam>
<v1:EmpNumberList><v1:EmpNumber> 9989071005 2004421004</v1:EmpNumber></v1:EmpNumberList>
</v1:MRRequestParam>
</soapenv:Body>
我需要编写的XSLT应该从EmpNumbersList中计算EmpNumbers 我需要在我的XSLT中调用存储过程,以便进行5次调用。 在一个电话中,我只传递了50个EmpNumbers。 我总共打了5个电话
First Call将拥有$ EmpNumber1,使其包含50个EmpNumbers
$EmpNumber1 = 9989071005 2004421004 (so on 50 EmpNumbers)
<argument type="SQL_VARCHAR" mode="INPUT" nullable="true" precision="0" scale="0" isNull="false"><xsl:value-of select="$EmpNumber1" />
</argument>
当我发回回复时,我需要对所有5个结果集进行分组并一次发送。 如果您有任何建议,请告诉我
答案 0 :(得分:2)
这个很容易:
使用强>:
string-length(translate(normalize-space(/*/*/*/v1:EmpNumber), '0123456789',''))+1
当应用于此文档时(提供的另一个号码):
<soapenv:Body xmlns:soapenv="my:soapenv">
<v1:MRRequestParam xmlns:v1="my:v1">
<v1:EmpNumberList>
<v1:EmpNumber> 9989071005 2004421004 1234567890 </v1:EmpNumber>
</v1:EmpNumberList>
</v1:MRRequestParam>
</soapenv:Body>
返回想要的正确结果:
3
这是一个完整的XSLT 1.0样式表,可以运行并验证是否始终生成正确的结果:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soapenv="my:soapenv" xmlns:v1="my:v1">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:value-of select=
"string-length(
translate(normalize-space(/*/*/*/v1:EmpNumber), '0123456789','')
)+1"/>
</xsl:template>
</xsl:stylesheet>
请注意:您必须在转换和XML文档中指定正确的命名空间 - 您没有在问题中提供它们。
<强>解释强>:
这个表达的含义:
string-length(
translate(normalize-space(/*/*/*/v1:EmpNumber), '0123456789','')
)+1
是:
normalize-space()
。这将获取字符串并从中生成一个新字符串,其中所有前导和尾随空白字符都将被删除。
剩下的只是每两个数字之间只有一个中间空格字符的数字。因此,如果有N个数字,则空格数为N-1。
表达式中引用的translate()
函数返回一个新的字符串,其中所有数字都消失了(替换为空字符串''。剩下的只有空格字符。
使用string-length()
函数,我们只需获取这些空格的计数**(N-1)。我们加1并得到字符串中所有数字的数字N.