xdmp:email 过滤掉不通过谓词的电子邮件地址
xdmp:email filtering out email addresses that don't pass a predicate
假设我有一个谓词:
declare function local:should-send-email($email-address) {
... fn:true() ...
... fn:false() ...
};
然后我有一个用于 xdmp:email
:
的电子邮件元素
<em:Message
xmlns:em="URN:ietf:params:email-xml:"
xmlns:rf="URN:ietf:params:rfc822:">
<rf:subject>Test</rf:subject>
<rf:from>
<em:Address>
<em:name>Test Name</em:name>
<em:adrs>test-from@test000.com</em:adrs>
</em:Address>
</rf:from>
<rf:to>
<em:Address>
<em:name>Test Name</em:name>
<em:adrs>test-to-1@test000.com</em:adrs>
</em:Address>
<em:Address>
<em:name>Test Name</em:name>
<em:adrs>test-to-2@test000.com</em:adrs>
</em:Address>
</rf:to>
<em:content>Hello World</em:content>
</em:Message>
假设其中一个 to 地址通过了谓词,而另一个没有。删除未通过的 em:Address 元素的有效方法是什么?
假设您打算从完整的 <em:Message>
元素开始,您可以使用递归类型切换来过滤掉无效的电子邮件地址 - 逻辑与 XSLT 非常相似:
declare function local:filter-addresses(
$node as node()
) as item()*
{
typeswitch ($node)
case element(em:Address) return
if (not(local:should-send-email($node/em:adrs)))
then () (: Filter :)
else $node
case element() return (: Passthrough :)
element { node-name($node) } {
$node/@*,
for $child in $node/node()
return local:filter-addresses($child)
}
default return $node
};
假设我有一个谓词:
declare function local:should-send-email($email-address) {
... fn:true() ...
... fn:false() ...
};
然后我有一个用于 xdmp:email
:
<em:Message
xmlns:em="URN:ietf:params:email-xml:"
xmlns:rf="URN:ietf:params:rfc822:">
<rf:subject>Test</rf:subject>
<rf:from>
<em:Address>
<em:name>Test Name</em:name>
<em:adrs>test-from@test000.com</em:adrs>
</em:Address>
</rf:from>
<rf:to>
<em:Address>
<em:name>Test Name</em:name>
<em:adrs>test-to-1@test000.com</em:adrs>
</em:Address>
<em:Address>
<em:name>Test Name</em:name>
<em:adrs>test-to-2@test000.com</em:adrs>
</em:Address>
</rf:to>
<em:content>Hello World</em:content>
</em:Message>
假设其中一个 to 地址通过了谓词,而另一个没有。删除未通过的 em:Address 元素的有效方法是什么?
假设您打算从完整的 <em:Message>
元素开始,您可以使用递归类型切换来过滤掉无效的电子邮件地址 - 逻辑与 XSLT 非常相似:
declare function local:filter-addresses(
$node as node()
) as item()*
{
typeswitch ($node)
case element(em:Address) return
if (not(local:should-send-email($node/em:adrs)))
then () (: Filter :)
else $node
case element() return (: Passthrough :)
element { node-name($node) } {
$node/@*,
for $child in $node/node()
return local:filter-addresses($child)
}
default return $node
};