2016-01-12 7 views

risposta

6

Si avrà probabilmente bisogno di usare xdmp:eval, che accetta un argomento opzioni, e lì è possibile specificare il database:

xdmp:eval("cts:search(...)", (), 
    <options xmlns="xdmp:eval"> 
    <database>{xdmp:database("otherdb")}</database> 
    </options>) 
+1

questo non è solo una buona risposta, ma è probabilmente l'unico corretto. Le tue uniche opzioni di specificare quale DB interrogare, che io sappia, sono: 'famiglia xdmp: eval', famiglia' xdmp: invoke' e 'xdmp: spawn'. – CtheGood

2

Anche se a livello più basso, xdmp: eval è davvero ciò che accade, il più l'opzione clean che è probabilmente la più semplice da scrivere in linea è xdmp:invoke-function - e potrebbe anche essere meglio usare anche una funzione anonima al suo interno. Questa combinazione consente l'uso naturale delle variabili esistenti. Se si vuole andare oltre, quindi anche guardare xdmp: applicare (per aggiungere più flexability)

Inoltre, a Mark Logic 8, v'è una nuova transazione di tipo chiamato update-auto-commit, che rende anche più bello e pulisci per invocare una funzione in linea, in attesa dei risultati (senza spawn) e averla nella propria transazione. Se usato correttamente, i risultati di un aggiornamento/inserimento sono persino disponibili nel codice chiamante.

L'esempio di codice qui sotto vale cts: ricerca contro un altro database e utilizza naturalmente le variabili nel codice principale:

xquery version "1.0-ml"; 
declare namespace html = "http://www.w3.org/1999/xhtml"; 

let $query := cts:word-query("foo") 
let $start := 1 
let $end := 3 
let $database-name := "your-other-database-name-here" 

return 
    xdmp:invoke-function(
     function() { 
      cts:search(doc(), $query)[$start to $end]   
     }, 
     <options xmlns="xdmp:eval"> 
     <database>{xdmp:database($database-name)}</database> 
     </options>) 
Problemi correlati