Search code examples
xquerymarklogic

How to insert a xquery module in a Template file in MarkLogic


I have written one xquery to get count of my records based on some conditions and would like to put the result as a column value in a Template document.

How can I call the xquery from the template in this case

Below is the Xquery which calls all documents from collection :GTM2_Shipment and gives count of records based on given condition.

 xquery version "1.0-ml";
fn:count(
   for $x in collection("GTM2_Shipment")
   let $currentdt := fn:current-date()
   let $sixmonthAgo := $currentdt - xs:yearMonthDuration("P6M")
   where ($x/*:Shipment/*:Ancillary/*:QuotePrice/text() != 0) and
   ($x/*:Shipment/*:ASN/*:TrackedItem/*:Consignment/*:ConsignmentHeader/*:CargoSummary/*:TransMode/text() = 'Road')
   and 
   (fn:substring($x/*:Shipment/*:ASN/*:TrackedItem/*:Consignment/*:Bookings/*:CargoBookingHeader/*:BookingCreateDt,0,11) gt
   (format-date($sixmonthAgo, "[Y0001]-[M01]-[D01]")))
   return $x
)

Example Template below where I want to add one more column named CountByRoad and add the above xquery and it refers the same collection -GTM2_Shipment:

xquery version "1.0-ml";
    import module namespace tde = "http://marklogic.com/xdmp/tde" at "/MarkLogic/tde.xqy";

if (xdmp:database-name(xdmp:database()) = "data-hub-final-SCHEMAS")  then          
    let $Custom_Shipment:=
   <template xmlns="http://marklogic.com/xdmp/tde">
  <path-namespaces>
    <path-namespace>
      <prefix>xmlns</prefix>
      <namespace-uri>http://www.globaltrademanagement_export.com/Shipment</namespace-uri>
    </path-namespace>
    <path-namespace>
      <prefix>ns00</prefix>
      <namespace-uri>http://www.globaltrademanagement_export.com/PurchaseOrderHeader</namespace-uri>
    </path-namespace>
    <path-namespace>
      <prefix>ns0</prefix>
      <namespace-uri>http://www.globaltrademanagement_export.com/ConsignmentHeader</namespace-uri>
    </path-namespace>
    <path-namespace>
      <prefix>ns1</prefix>
      <namespace-uri>http://www.globaltrademanagement_export.com/PurchaseOrderDrop</namespace-uri>
    </path-namespace>
    <path-namespace>
      <prefix>ns2</prefix>
      <namespace-uri>http://www.globaltrademanagement_export.com/ItemDetail</namespace-uri>
    </path-namespace>
    <path-namespace>
      <prefix>ns5</prefix>
      <namespace-uri>http://www.globaltrademanagement_export.com/TransportationUnitHeader</namespace-uri>
    </path-namespace>
    <path-namespace>
      <prefix>ns7</prefix>
      <namespace-uri>http://www.globaltrademanagement_export.com/PurchaseOrderDelivery</namespace-uri>
    </path-namespace>
    <path-namespace>
      <prefix>ns9</prefix>
      <namespace-uri>http://www.globaltrademanagement_export.com/BaseType</namespace-uri>
    </path-namespace>
    <path-namespace>
      <prefix>ns10</prefix>
      <namespace-uri>http://www.globaltrademanagement_export.com/ASN</namespace-uri>
    </path-namespace>
    <path-namespace>
      <prefix>ns11</prefix>
      <namespace-uri>http://www.globaltrademanagement_export.com/TransportationUnitHeader</namespace-uri>
    </path-namespace>
    <path-namespace>
      <prefix>ns13</prefix>
      <namespace-uri>http://www.globaltrademanagement_export.com/ContainmentHeader</namespace-uri>
    </path-namespace>
    <path-namespace>
      <prefix>ns14</prefix>
      <namespace-uri>http://www.globaltrademanagement_export.com/CargoBookingHeader</namespace-uri>
    </path-namespace>
    <path-namespace>
      <prefix>ns15</prefix>
      <namespace-uri>http://www.globaltrademanagement_export.com/Consignment</namespace-uri>
    </path-namespace>
    <path-namespace>
      <prefix>ps</prefix>
      <namespace-uri>http://www.globaltrademanagement_export.com/Shipment</namespace-uri>
    </path-namespace>
  </path-namespaces>
  <context>//ps:Shipment</context>
  <collections>
    <collection>GTM2_Shipment</collection>
  </collections>
  <rows>
    <row>
      <schema-name>GTM2_Shipment</schema-name>
      <view-name>Shipment_View</view-name>
      <view-layout>sparse</view-layout>
      <columns>
    <column>
      <name>Shipment_Ref</name>
      <scalar-type>string</scalar-type>
      <val>//ps:ShipmentRef</val>
    <nullable>true</nullable>
    </column>
    <column>
      <name>User</name>
      <scalar-type>string</scalar-type>
      <val>//ns10:ASN/ns9:DocumentHeader/ns9:Version/ns9:CurrentVersion/ns9:User</val>
      <nullable>true</nullable>
    </column>
     <column>
      <name>PurchaseOrder</name>
      <scalar-type>string</scalar-type>
      <val>//ns10:ASN/ns10:TrackedItem/ns15:Consignment/ns0:ConsignmentHeader/ns0:RefPurchaseOrders</val>
      <nullable>true</nullable>
    </column>
    <column>
      <name>Carrier_LocalCode</name>
      <scalar-type>string</scalar-type>
      <val>//ns10:ASN/ns10:TrackedItem/ns15:Consignment/ns0:ConsignmentHeader/ns0:Carrier/ns9:LocalCode</val>
      <nullable>true</nullable>
    </column>
    
    <column>
      <name>Notify_PartyCode</name>
      <scalar-type>string</scalar-type>
      <val>//ns10:ASN/ns10:TrackedItem/ns15:Consignment/ns0:ConsignmentHeader/ns0:Notify/ns9:Code</val>
      <nullable>true</nullable>
    </column>
    <column>
      <name>houseBill_Ref</name>
      <scalar-type>string</scalar-type>
      <val>//ns10:ASN/ns10:TrackedItem/ns15:Consignment/ns0:ConsignmentHeader/ns0:HouseBillRef</val>
      <nullable>true</nullable>
    </column>
    <column>
      <name>primaryVessel</name>
      <scalar-type>string</scalar-type>
      <val>//ns10:ASN/ns10:TrackedItem/ns15:Consignment/ns0:ConsignmentHeader/ns0:PrimaryVessel</val>
      <nullable>true</nullable>
    </column>
    <column>
      <name>Dept</name>
      <scalar-type>string</scalar-type>
      <val>//ns10:ASN/ns10:TrackedItem/ns15:Consignment/ns0:ConsignmentHeader/ns0:Dept</val>
      <nullable>true</nullable>
    </column>
    <column>
      <name>Route</name>
      <scalar-type>string</scalar-type>
      <val>//ns10:ASN/ns10:TrackedItem/ns15:Consignment/ns0:ConsignmentHeader/ns0:Route</val>
      <nullable>true</nullable>
    </column>
    <column>
      <name>transMode</name>
      <scalar-type>string</scalar-type>
      <val>//ns10:ASN/ns10:TrackedItem/ns15:Consignment/ns0:ConsignmentHeader/ns0:CargoSummary/ns0:TransMode</val>
      <nullable>true</nullable>
    </column>
    <column>
      <name>OSP_PartyName</name>
      <scalar-type>string</scalar-type>
      <val>//ns10:ASN/ns10:TrackedItem/ns15:Consignment/ns0:ConsignmentHeader/ns0:CargoSummary/ns0:OSP/ns9:PartyName</val>
      <nullable>true</nullable>
    </column>
    <column>
      <name>OSP_Code</name>
      <scalar-type>string</scalar-type>
      <val>//ns10:ASN/ns10:TrackedItem/ns15:Consignment/ns0:ConsignmentHeader/ns0:CargoSummary/ns0:OSP/ns9:Code</val>
      <nullable>true</nullable>
    </column>
    
    <column>
      <name>Trans_UnitRef</name>
      <scalar-type>string</scalar-type>
      <val>//ns10:ASN/ns10:Schedule/ns11:TransportationUnitHeader/ns11:PrimarytUnit/ns11:TransportUnit/ns11:TransUnitRef</val>
      <nullable>true</nullable>
    </column>
    <column>
      <name>POL_Name</name>
      <scalar-type>string</scalar-type>
      <val>//ns10:ASN/ns10:Schedule/ns11:TransportationUnitHeader/ns11:PrimarytUnit/ns11:TransportUnit/ns11:PortOfLoading/ns9:PortName</val>
      <nullable>true</nullable>
    </column>
    <column>
      <name>POL_ETA_Sch_Dep</name>
      <scalar-type>dateTime</scalar-type>
      <val>//ns10:ASN/ns10:Schedule/ns11:TransportationUnitHeader/ns11:PrimarytUnit/ns11:TransportUnit/ns11:PortOfLoading/ns9:ScheduledDepartureDate</val>
      <nullable>true</nullable>
      <invalid-values>ignore</invalid-values>
    </column>
    <column>
      <name>POL_ETA_Act_Dep</name>
      <scalar-type>dateTime</scalar-type>
      <val>//ns10:ASN/ns10:Schedule/ns11:TransportationUnitHeader/ns11:PrimarytUnit/ns11:TransportUnit/ns11:PortOfLoading/ns9:ActualDepartureDate</val>
      <nullable>true</nullable>
      <invalid-values>ignore</invalid-values>
    </column>
    <column>
      <name>POL_ETA_Sch_Arr</name>
      <scalar-type>dateTime</scalar-type>
      <val>//ns10:ASN/ns10:Schedule/ns11:TransportationUnitHeader/ns11:PrimarytUnit/ns11:TransportUnit/ns11:PortOfLoading/ns9:ScheduledArrivalDate</val>
      <nullable>true</nullable>
      <invalid-values>ignore</invalid-values>
    </column>
    <column>
      <name>POL_ETA_Act_Arr</name>
      <scalar-type>dateTime</scalar-type>
      <val>//ns10:ASN/ns10:Schedule/ns11:TransportationUnitHeader/ns11:PrimarytUnit/ns11:TransportUnit/ns11:PortOfLoading/ns9:ActualArrivalDate</val>
      <nullable>true</nullable>
      <invalid-values>ignore</invalid-values>
    </column>
    <column>
      <name>POD_Name</name>
      <scalar-type>string</scalar-type>
      <val>//ns10:ASN/ns10:Schedule/ns11:TransportationUnitHeader/ns11:PrimarytUnit/ns11:TransportUnit/ns11:PortOfDischarge/ns9:PortName</val>
      <nullable>true</nullable>
      <invalid-values>ignore</invalid-values>
    </column>
    <column>
      <name>BookingCreateDt</name>
      <scalar-type>dateTime</scalar-type>
      <val>//ns10:ASN/ns10:TrackedItem/ns15:Consignment/ns15:Bookings/ns14:CargoBookingHeader/ns14:BookingCreateDt</val>
      <nullable>true</nullable>
    <invalid-values>reject</invalid-values>
    </column>

  <column>
      <name>Ancillary_QuotePrice</name>
      <scalar-type>decimal</scalar-type>
      <val>//ps:Ancillary/ps:QuotePrice</val>
      <nullable>true</nullable>
    <invalid-values>reject</invalid-values>
    </column>
      </columns>
    </row>
  </rows>
</template>
return
(

tde:template-insert("/GTM2/SHIPMENT_ShipmentView.xml",$Custom_Shipment),
      "template inserted")
      else ("Please select correct database.")
  

Solution

  • I don't think you can do what you want.

    https://docs.marklogic.com/guide/app-dev/TDE#id_71415

    For performance and security reasons, your path expressions are limited to a subset of XPath. For more details, see Template Driven Extraction (TDE) in the XQuery and XSLT Reference Guide.

    https://docs.marklogic.com/guide/app-dev/TDE#id_99178

    Templates support a dialect using a subset of XQuery with limited functionalities where only a subset of functions are available.

    More complex operations like looping, FLWOR statements, iterations, and XML construction are not supported within the dialect. The property axis property:: is also not supported.