Email xdmp:电子邮件过滤掉不存在';不要传递谓词
假设我有一个谓词:Email xdmp:电子邮件过滤掉不存在';不要传递谓词,email,xquery,marklogic,Email,Xquery,Marklogic,假设我有一个谓词: declare function local:should-send-email($email-address) { ... fn:true() ... ... fn:false() ... }; 然后我有一个email元素用于xdmp:email: <em:Message xmlns:em="URN:ietf:params:email-xml:" xmlns:rf="URN:ietf:params:rfc822:"> <rf:subjec
declare function local:should-send-email($email-address) {
... fn:true() ...
... fn:false() ...
};
然后我有一个email元素用于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>
试验
测试名称
试验-from@test000.com
测试名称
试验-1@test000.com
测试名称
试验-2@test000.com
你好,世界
假设其中一个to地址传递谓词,另一个不传递。对于未通过的元素,删除em:Address元素的有效方法是什么?假设您打算从完整的
元素开始,您可以使用递归类型开关来过滤无效的电子邮件地址-逻辑与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
};
很好!我只改变了一件小事。在:$node/@*之后,我添加了:$node/text(),感谢您的高效解决方案。@TutanRamen啊,我明白了。一种非常简单的方法是将
$node/*
更改为$node/node()
。这还有一个额外的好处,就是保持文本节点和其他节点的原始顺序,这在这里不应该是一个问题,但是如果您正在对更复杂的XML进行类似的操作,请参考。我做了上面的更改以供参考。非常方便的小功能