2017-05-18 1 views
1

Bonjour, j'utilise MarkLogic 9.0 et j'ai un niveau d'expérience débutant avec ML et XML. J'ai suivi le MarkLogic SQL Guide avec succès et je veux l'utiliser dans le monde réel et extraire des fichiers xml transactionnels l'élément type. Mais dans la vue que j'ai créée retourne un résultat vide. Je pense que cela a quelque chose à voir avec le xsd et le xsi. Mais comme je l'ai mentionné plus tôt, je suis à un niveau débutant et je ne sais pas comment résoudre ce problème.MarkLogic TDE sur documents XML avec XSD et XSI

Le texte suivant décrit le scénario pour reproduire le problème.

Je charge 3500 documents xml dans le SQLData (avec triple index de magasin) J'ai également créé une base de données SQLSchema qui est liée à la base de données SQLData comme décrit dans le Guide. Tous les documents XML a une structure similaire à l'exemple ci-dessous:

<?xml version="1.0" encoding="UTF-8"?> 
<scope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <item> 
    <transaction> 
     <type>CI</type> 
     <sscc>00000379461100000007</sscc> 
     <location>4260210630688</location> 
     <device>VISTALINK.004</device> 
     <date>2017-04-25</date> 
     <time>01:22:20</time> 
     <gmtOffset>+02:00</gmtOffset> 
     <actorId>155081</actorId> 
    </transaction> 
    <order> 
     <orderNumber>3794611</orderNumber> 
    </order> 
    </item> 
</scope> 

avec un URI comme celui-ci (tous les documents a une structure similaire):

/transactions/2017-04-25_01-22-20_3794611_00000379461100000007_CI.xml 

Maintenant, je créé un modèle avec la structure suivante:

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

let $transactions := 
<template xmlns="http://marklogic.com/xdmp/tde"> 
    <context>/transactions</context> 
    <rows> 
    <row> 
     <schema-name>main</schema-name> 
     <view-name>transactions</view-name> 
     <columns> 
     <column> 
      <name>type</name> 
      <scalar-type>string</scalar-type> 
      <val>type</val> 
     </column> 
    </columns> 
    </row> 
    </rows> 
</template> 
return tde:template-insert("Transactions.xml", $transactions) 

je aussi changer le contexte:

<context>item</context> 

et /article

Il ne retourne pas d'erreur, donc je pense que le résultat sera bien

Quand j'exécutez l'instruction suivante dans la console SQL retourne un résultat vide:

select * from transactions; 

Quand je valident le modèle ci-dessus, il renvoie le résultat folowing:

<map:map xmlns:map="http://marklogic.com/xdmp/map" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<map:entry key="valid"> 
<map:value xsi:type="xs:boolean">false</map:value> 
</map:entry> 
<map:entry key="error"> 
<map:value xsi:type="xs:string">TDE-INVALIDTEMPLATENODE</map:value> 
</map:entry> 
<map:entry key="message"> 
<map:value xsi:type="xs:string">TDE-INVALIDTEMPLATENODE: Invalid extraction template node: /tde:template/tde:rows/text()</map:value> 
</map:entry> 
</map:map> 

Ainsi, l'erreur en validant est:

Invalid extraction template node: /tde:template/tde:rows/text() 
Invalid extraction template node: 

/TDE: template/TDE: lignes/texte()

Est-ce que quelqu'un sait comment je peux résoudre ce problème?

+0

Peut-être que ce n'est qu'une simple erreur. Vous avez '/transactions', mais le contexte est comme une expression de correspondance XSLT, pas un filtre de répertoire. Vous voulez probablement changer la valeur en 'transaction' ou' item', puisqu'il n'y a pas d'élément avec le nom 'transactions'. – grtjn

+0

Merci pour la réponse. J'essaie de changer la valeur de l'élément de contexte en item ou en transaction tous les deux obtiennent le même résultat (voir ajuster la question). –

+0

J'ajuste maintenant quelques informations supplémentaires sur les résultats de validation –

Répondre

4

Le problème est dans votre contexte. Vous avez spécifié <context>item</context> mais en fonction de votre document d'exemple item est un enfant de scope. Par conséquent, votre modèle devrait ressembler à ceci:

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

let $transactions := 
<template xmlns="http://marklogic.com/xdmp/tde"> 
    <context>/scope/item/transaction</context> 
    <rows> 
    <row> 
     <schema-name>main</schema-name> 
     <view-name>transactions</view-name> 
     <columns> 
     <column> 
      <name>type</name> 
      <scalar-type>string</scalar-type> 
      <val>type</val> 
     </column> 
    </columns> 
    </row> 
    </rows> 
</template> 
return tde:template-insert("Transactions.xml", $transactions) 

Alors, que faisons-nous ici? Nous spécifions le contexte à /scope/item/transaction car la colonne type que vous avez spécifiée dans votre définition de ligne se trouve sous ces éléments. Chargement de ce modèle vous permettra d'exécuter l'instruction SQL SELECT * FROM transactions;

+1

Vous pouvez laisser de côté '/ scope/item /' du contexte. Il accepte ["N'importe quelle expression de chemin indexable"] (http://docs.marklogic.com/guide/app-dev/TDE#id_71415), mais devrait en fait être 'transaction' plutôt que' item', sinon l'expression pour le La colonne 'type' ne retournera rien, et TDE se plaindra:' Eval for Column type = 'type' retourne une séquence vide pour une colonne non-nullable .. – grtjn

+0

Merci beaucoup !! Cela fonctionne:) ... –

+0

Pas de soucis du tout :) – Tamas