0
votes

Comment utiliser la fenêtre Tumbling pour grouper des éléments XML par contenu?

Comment puis-je groupe sur la base de savoir s'il y a une correspondance à [0-9] pour les chiffres avec une fenêtre de tumbling ?

Sortie souhaitée: xxx

sortie en cours, non groupé: xxx

entrée: xxx

le La notion est que chaque "personne" aura un nom (pas de chiffres) et peut-être des données supplémentaires. Donc cherche à lire dans chaque ligne, puis groupe en fonction de l'endroit où les noms sont trouvés.

code: xxx

regardant la sortie "Phone3Sue" Faites évidemment une correspondance et un regroupement, bien que cela ne soit pas exactement aussi souhaité, car "Phone3" devrait être dans son propre élément, imbriqué dans "Joe" plutôt que "Sue". Mais, toujours, il y a quelque chose de correspondance là-bas.


de la liste de diffusion saxonne:

Le mercredi 19 février 2020 à 10:31:37 -0800, Thufir Scripsit:

Je vais relire la section sur Windowing; mon impression était que c'était plus à des fins d'affichage ou de rapport.

Windowing est la manière dont vous prenez des morceaux d'un flux de données.

Qu'est-ce que vous avez, c'est effectivement un flux d'éléments de ligne; vous pouvez Identifiez les lignes "Nom", mais vous ne le faites pas maintenant à quelle distance ils sont / comment Beaucoup de données sont entre une paire de noms particulière.

Windows vous permet de dire "Je veux le morceau de ce flux qui commence par une ligne de nom et continue jusqu'à (mais non inclus) le nom suivant ligne ".

Élaboreriez-vous sur ce que vous entendez par deux étapes, un peu plus concrètement?

Vous essayez de prendre des entrées XML et de la transformer en une sortie différente Xml.

S'il s'agit de la transformation pure - Changez tous les éléments nommés foo à l'élément nommé Baz - XQuery's n'est pas le meilleur choix d'outils. Utilisez XSLT si vous pouvez. Ils sont calculément les mêmes mais les langues ont différents biais et xslt se transforme plus naturellement.

Si la sortie XML est une représentation d'une abstraction de votre entrée - moralement une sorte de rapport - cela aide beaucoup à avoir l'abstraction, puis à le présenter.

Donc, dans votre cas, ce que vous avez est un flux contenant une implicite association entre noms et données. (C'est un flux de lignes; le seul Voici, vous savez que ces lignes de données vont avec cette ligne de noms. Alors implicite.) Si vous tournez cela en une cartographie explicite entre les noms et des données - telles que la création d'une variable de carte où les clés sont la contenu de la ligne de nom (avec des espaces manipulés en quelque sorte) et le Les entrées pour chaque clé sont les lignes de données associées à ce nom - Vous avez fait la partie abstraction.

Vous pouvez alors prendre cette carte et produire la sortie XML que vous voulez de C'est beaucoup plus simple que d'essayer de combiner la "nouvelle xml" et "faire les étapes d'abstraction". La dernière chose que j'ai postée a un Exemple de transformation d'une carte en éléments, mais comme motif c'est juste

Carte: clés ($ carte)! {.} {$ carte (.)}

(il devient plus compliqué si vous avez des nœuds ou une séquence dans le entrée, mais pas beaucoup plus.)

qui fait quelque chose un peu plus près du sens?

- Graydon

_______________________________________________ Liste de postage Saxon-Help archivée à http://saxon.markmail.org/ Saxon-help@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/saxon-help


0 commentaires

3 Réponses :


1
votes

Si vous utilisez 3.0 ou 3.1, utilisez la clause "Fenêtre" de l'expression Flwor. Quelque chose comme xxx

non testé et probablement besoin de correction ou d'adaptation.


0 commentaires

0
votes

Ceci est probablement assez proche : xxx

code: xxx


0 commentaires

1
votes

Les essais suivants pour utiliser une fenêtre code> Tumbling code> qui commence par une ligne code> code> ne contenant aucun chiffre ASCII (le nom code> du Personne code>) suivi de toute ligne contenant au moins un chiffre ASCII (c.-à-d. Les lignes code> code>): xxx pré>

https://xquereryfiddle.liberty-development.net/gwmups1 p>

sortie Il y a p>

<?xml version="1.0" encoding="UTF-8"?>
<xml>
   <person>
      <name>joe</name>
      <data>phone1</data>
      <data>phone2</data>
      <data>phone3</data>
   </person>
   <person>
      <name>sue</name>
      <data>cell4</data>
      <data>home5</data>
   </person>
   <person>
      <name>alice</name>
      <data>atrib6</data>
      <data>x7</data>
      <data>y9</data>
      <data>z10</data>
   </person>
</xml>


2 commentaires

Lol, pardon pour changer la question, mais si une ligne est vide? semble lancer une clé. (Je travaille sur simplement enlever "vide" comme où il n'y a pas de texte.


À présent, avec trois exemples d'utilisation de la clause de la fenêtre, vous devez comprendre ou au moins une sensation de ce qu'il faut adapter, évidemment la condition correspond à ($ données, '[0-9]') peut ' t ne pas être vrai si vous avez maintenant vide line éléments. S'ils sont censés faire partie des "données" d'une "personne", changez cette condition en et ($ de données ($) [0-9] ') ou non ($ Data / noeud (noeud (noeud $)) ) . Si vous ne voulez pas les traiter du tout, bien, puis sélectionnez uniquement pour la fenêtre de tumbling $ personne dans le texte / la ligne [nœud ()] pour la séquence que vous traitez avec pour la fenêtre de tumbling .