XSLT中的分页

时间:2011-01-25 21:24:27

标签: xslt xpath

我的要求如下。 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个结果集进行分组并一次发送。 如果您有任何建议,请告诉我

1 个答案:

答案 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

是:

  1. normalize-space()。这将获取字符串并从中生成一个新字符串,其中所有前导和尾随空白字符都将被删除。

  2. 剩下的只是每两个数字之间只有一个中间空格字符的数字。因此,如果有N个数字,则空格数为N-1。

  3. 表达式中引用的translate()函数返回一个新的字符串,其中所有数字都消失了(替换为空字符串''。剩下的只有空格字符。

  4. 使用string-length()函数,我们只需获取这些空格的计数**(N-1)。我们加1并得到字符串中所有数字的数字N.