接受非数字字符的 XPath 条件
XPath condition that accepts non-numerical characters
我目前正在 SAP PI(接收方确定对象)中构建一个 XPath 条件,它应该将消息路由到接收方 1 或接收方 2。
商家发送的给定 documentID 值如下。
收件人 1 收到以下 documentID 范围内的邮件
Range: "F00" to "F99"
接收者 2 收到以下 documentID 范围内的消息
Range: "FA0" to "FZ9"
我能想到的示例条件,但不确定这是否可行或逻辑是否正确。跟进问题,greater/less 符号是否接受非数字字符?
接收器 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中使用substring。请随时提供您的意见。谢谢
此致,
查尔斯·谭
纯 XPath 1.0 解决方案:
Receiver 1 receives messages within below documentID range Range: F00
to F99
/*/Upload/ContainerEvent
[WorkAssignmentId
[string-length() = 3]
[starts-with(., 'F')][substring(.,2,2) >= 0][99 >= substring(.,2,2)]
]/EX
Receiver 2 receives messages within below documentID range Range: FA0
to 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 源文档时(提供none):
<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>
回答您的后续问题 ("does greater/less than signs accept non-numerical characters?"):在 XPath 1.0 中,不,greater-than/less-than 仅对数字进行操作。这在 XPath 2.0 中发生了变化。
我目前正在 SAP PI(接收方确定对象)中构建一个 XPath 条件,它应该将消息路由到接收方 1 或接收方 2。
商家发送的给定 documentID 值如下。
收件人 1 收到以下 documentID 范围内的邮件
Range: "F00" to "F99"
接收者 2 收到以下 documentID 范围内的消息
Range: "FA0" to "FZ9"
我能想到的示例条件,但不确定这是否可行或逻辑是否正确。跟进问题,greater/less 符号是否接受非数字字符?
接收器 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中使用substring。请随时提供您的意见。谢谢
此致, 查尔斯·谭
纯 XPath 1.0 解决方案:
Receiver 1 receives messages within below documentID range Range: F00 to F99
/*/Upload/ContainerEvent
[WorkAssignmentId
[string-length() = 3]
[starts-with(., 'F')][substring(.,2,2) >= 0][99 >= substring(.,2,2)]
]/EX
Receiver 2 receives messages within below documentID range Range: FA0 to 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 源文档时(提供none):
<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>
回答您的后续问题 ("does greater/less than signs accept non-numerical characters?"):在 XPath 1.0 中,不,greater-than/less-than 仅对数字进行操作。这在 XPath 2.0 中发生了变化。