2016-02-02 74 views
2

比方說,我有一個謂語:xdmp:電子郵件過濾掉的電子郵件地址,沒有通過謂詞

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>[email protected]</em:adrs> 
    </em:Address> 
    </rf:from> 
    <rf:to> 
    <em:Address> 
     <em:name>Test Name</em:name> 
     <em:adrs>[email protected]</em:adrs> 
    </em:Address> 
    <em:Address> 
     <em:name>Test Name</em:name> 
     <em:adrs>[email protected]</em:adrs> 
    </em:Address> 
    </rf:to> 
    <em:content>Hello World</em:content> 
</em:Message> 

可以說,其中一個地址通過謂詞,一個不會。什麼是一個有效的方式來刪除em:地址元素爲不通過的?

回答

3

假定你打算開始與完整<em:Message>元素,你可以使用遞歸typeswitch過濾掉無效的電子郵件地址 - 邏輯非常相似,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 
}; 
+0

的偉大工程! 我只改變了一件小事。之後: $ node/@ *, 我加了: $ node/text(), 感謝您的高效解決方案。 –

+0

@TutanRamen啊,我明白了。一個*非常輕微*更緊湊的方法可以將'$ node/*'更改爲'$ node/node()'。這還會使文本節點和其他節點保持其原有順序,這在這裏不應該成爲問題,但如果您使用更復雜的XML進行類似的操作,只需要簡單提供一次即可。我上面做了更改以供參考。 – wst

+0

非常方便的小功能 –