Hi Geert,

Wow, thank you for putting so much effort into answering my questions and
for providing an example.  This is really great.

Tim

-----Original Message-----
From: [email protected]
[mailto:[email protected]] On Behalf Of Geert Josten
Sent: Tuesday, November 03, 2009 4:00 AM
To: General Mark Logic Developer Discussion
Subject: RE: [MarkLogic Dev General] Validating an XML document
inMarkLogicthat references a DTD as part of a precommit trigger

Hi Tim,

> I need to validate against the schema form of the DTD, i.e.
> Archive-1.0.xsd.  I could replace the DTD reference with an
> XML schema reference in the XML file prior to loading it into
> ML, but I prefer to perform all content manipulation in MarkLogic.

To summarize, no need to do this. Just leave the DTD declaration, and it is
not necessary to add a reference a schema either. Adding schema location
attributes to your content would make things less flexible..

> Does this sound feasible?  Can anyone provide a code snippet
> of performing validation as part of a precommit trigger?

You need to take several steps to make this work:

1) Add your schema to the database that is configured as the schemas
database of your documents database. There are plenty ways to do this..

2) Create and insert a module in some (modules) database that will do the
actual validation. It could be something like this:

        xquery version "1.0-ml";

        declare namespace trgr="http://marklogic.com/xdmp/triggers";;

        declare variable $trgr:uri as xs:string external;
        declare variable $trgr:trigger as node() external;

        validate strict {
                doc($trgr:uri)
        },
        "ok"

3) Create pre-commit triggers that calls the above module. You can use
something like the following, but make sure to execute this against the
database that is configured as the triggers database of your documents
database (I wrapped the code below in a xdmp:eval, to make it execute
against the triggers database; hence the external variables):

                        xquery version "1.0-ml";
                        import module namespace
trgr="http://marklogic.com/xdmp/triggers"; at "/MarkLogic/triggers.xqy";
                        declare variable $trigger-create-name as xs:string
external;
                        declare variable $trigger-create-description as
xs:string external;
                        declare variable $trigger-modify-name as xs:string
external;
                        declare variable $trigger-modify-description as
xs:string external;
                        declare variable $trigger-module-uri as xs:string
external;
                        try {
                                (: trigger for new documents insert :)
                                let $create-trigger :=
                                        trgr:create-trigger(
                                                $trigger-create-name,
                                                $trigger-create-description,
                                                trgr:trigger-data-event(
 
trgr:directory-scope("/", "infinity"),
 
trgr:document-content("create"),
                                                       trgr:pre-commit()
                                                ),
                                                trgr:trigger-module(
 
xdmp:database("Modules"),
                                                        "/",
 
$trigger-module-uri),
                                                (:enable immediately:)
true(),
                                                xdmp:default-permissions()
                                        )
                                (: trigger for documents updates :)
                                let $modify-trigger :=
                                        trgr:create-trigger(
                                                $trigger-modify-name,
                                                $trigger-modify-description,
                                                trgr:trigger-data-event(
 
trgr:directory-scope("/", "infinity"),
 
trgr:document-content("modify"),
                                                       trgr:pre-commit()
                                                ),
                                                trgr:trigger-module(
 
xdmp:database("Modules"),
                                                        "/",
 
$trigger-module-uri),
                                                (:enable immediately:)
true(),
                                                xdmp:default-permissions()
                                        )
                                return
                                        "Triggers succesfully installed.."
                        } catch ($exception) {
                                ()
                        }

4) Add schema mappings to your application server. Use the admin interface,
go the configuration of your app server, and open the schemas page. Add a
schema mapping in which you leave the namespace uri blank, and add the uri
to the schema you added in step 1..

You can skip step 4 if you add import schema lines in the validating module,
but this is more flexible. Add the following lines if you don't need the
flexibility:

        declare default element namespace "";
        import schema "" at "/my-schema.xsd";


You can do document inserts from anywhere now, these will always be
validated. Note that invalid documents will throw exceptions that cannot be
caught as usual. A failing pre-commit trigger is supposed to make the whole
transaction fail. You can put xdmp:eval around xdmp:document-insert
statements, that will allow capturing these exceptions in a try catch, but
use this with care..

Kind regards,
Geert



Drs. G.P.H. Josten
Consultant


http://www.daidalos.nl/
Daidalos BV
Source of Innovation
Hoekeindsehof 1-4
2665 JZ Bleiswijk
Tel.: +31 (0) 10 850 1200
Fax: +31 (0) 10 850 1199
http://www.daidalos.nl/
KvK 27164984
De informatie - verzonden in of met dit emailbericht - is afkomstig van
Daidalos BV en is uitsluitend bestemd voor de geadresseerde. Indien u dit
bericht onbedoeld hebt ontvangen, verzoeken wij u het te verwijderen. Aan
dit bericht kunnen geen rechten worden ontleend.



_______________________________________________
General mailing list
[email protected]
http://xqzone.com/mailman/listinfo/general


_______________________________________________
General mailing list
[email protected]
http://xqzone.com/mailman/listinfo/general

Reply via email to