Hi Tim, It was mostly putting loose bits together... ;-)
Kind regards, Geert > -----Original Message----- > From: [email protected] > [mailto:[email protected]] On Behalf Of > Tim Meagher > Sent: dinsdag 3 november 2009 13:59 > 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 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 > _______________________________________________ General mailing list [email protected] http://xqzone.com/mailman/listinfo/general
