0

我目前正在 SAP PI(接收器确定对象)中构建一个 XPath 条件,它应该将消息路由到接收器 1 或接收器 2。

商家发送的给定 documentID 值如下。

接收方 1 接收低于 documentID 范围内的消息

Range: "F00" to "F99"

Receiver 2 接收低于 documentID 范围的消息

Range: "FA0" to "FZ9"

我能想到的示例条件,但不确定这是否可行或逻辑是否正确。跟进问题,大于/小于符号是否接受非数字字符?

接收器 1 的条件

(/p1:Upload/ContainerEvent[WorkAssignmentID >= F00] EX  AND /p1:Upload/ContainerEvent[WorkAssignmentID <= F99] EX ) 

接收器 2 的条件

(/p1:Upload/ContainerEvent[WorkAssignmentID >= FA0] EX  AND /p1:Upload/ContainerEvent[WorkAssignmentID <= FZ9] EX ) 

我也在考虑是否可以在 XPath 中使用子字符串。随时提供您的意见。谢谢

问候,查尔斯·谭

4

2 回答 2

2

纯 XPath 1.0 解决方案:

接收方 1 接收低于 documentID 范围的消息 范围:F00 到 F99

/*/Upload/ContainerEvent
               [WorkAssignmentId
                 [string-length() = 3]
                 [starts-with(., 'F')][substring(.,2,2) >= 0][99 >= substring(.,2,2)]
                ]/EX

Receiver 2 接收低于 documentID 范围的消息 范围:FA0 到 FZ9

/*/Upload/ContainerEvent
               [WorkAssignmentId
                   [string-length() = 3]
                   [starts-with(., 'F')] 
                   [26 > string-length(
                            translate('ABCDEFGHIJKLMNOPQRSTUVWXYZ',substring(.,2,1), ''))]
                   [substring(.,3,1) >= 0][9 >= substring(.,3,1)]
                ]/EX

这是基于 XSLT 的验证

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="/">
    <xsl:copy-of select=
    "/*/Upload/ContainerEvent
               [WorkAssignmentId
                 [string-length() = 3]
                 [starts-with(., 'F')][substring(.,2,2) >= 0][99 >= substring(.,2,2)]
                ]/EX"/>
==============================
    <xsl:copy-of select=
    "/*/Upload/ContainerEvent
               [WorkAssignmentId
                   [string-length() = 3]
                   [starts-with(., 'F')] 
                   [26 > string-length(
                            translate('ABCDEFGHIJKLMNOPQRSTUVWXYZ',substring(.,2,1), ''))]
                   [substring(.,3,1) >= 0][9 >= substring(.,3,1)]
                ]/EX"/>

  </xsl:template>
</xsl:stylesheet>

当此转换应用于以下 XML 源文档(未提供)时:

<p1>
    <Upload>
        <ContainerEvent>
            <WorkAssignmentId>F13</WorkAssignmentId>
            <EX>F13</EX>
        </ContainerEvent>
        <ContainerEvent>
            <WorkAssignmentId>F99</WorkAssignmentId>
            <EX>F99</EX>
        </ContainerEvent>
        <ContainerEvent>
            <WorkAssignmentId>E15</WorkAssignmentId>
            <EX>E15</EX>
        </ContainerEvent>
        <ContainerEvent>
            <WorkAssignmentId>FA7</WorkAssignmentId>
            <EX>FA7</EX>
        </ContainerEvent>
        <ContainerEvent>
            <WorkAssignmentId>FZ9</WorkAssignmentId>
            <EX>FZ9</EX>
        </ContainerEvent>
        <ContainerEvent>
            <WorkAssignmentId>FAB</WorkAssignmentId>
            <EX>FAB</EX>
        </ContainerEvent>
    </Upload>
</p1>

产生了想要的结果

<EX>F13</EX>
<EX>F99</EX>
==============================
<EX>FA7</EX>
<EX>FZ9</EX>
于 2017-05-14T23:25:45.523 回答
0

回答您的后续问题(“大于/小于符号是否接受非数字字符?”):在 XPath 1.0 中,不,大于/小于仅对数字进行操作。这在 XPath 2.0 中发生了变化。

于 2017-05-15T08:04:31.980 回答