Nano Hash - криптовалюты, майнинг, программирование

как объединить/сгруппировать XML-документ на основе дочернего узла

Интересно, как объединить/группировать/объединить XML-элементы по их содержимому, чтобы сгруппированные значения встречались только один раз, а остальная часть узла сливалась с результатом, точно так же, как группируются результаты в современных SQL-диалектах, таких как MariaDB (без наличие дубликатов в результатах).

Я уже искал решение, но приведенные примеры здесь или где-то еще не соответствуют моим требованиям - в том числе и после их корректировки. Я предполагаю, что положение <lemma> может быть проблемой. С другой стороны, я думаю/надеюсь, что какое-то решение все же возможно.

Упрощенная структура моих документов и желаемый результат:

XML:

<root>
  <artikel>
    <lemma-position>
      <lemma>Abend</lemma>
      <info>aaa</info>
    </lemma-position>
    <bedeutungsposition nr="1a">
      <bedeutung>Zeit am Ende des Tages</bedeutung>
    </bedeutungsposition>
    <bedeutungsposition nr="1b">
      <bedeutung>
        was anderes
      </bedeutung>
    </bedeutungsposition>
  </artikel>
  <artikel>
    <lemma-position>
      <lemma>Abend</lemma>
      <info>bbb</info>
    </lemma-position>
    <bedeutungsposition nr="1">
      <bedeutung>abcdefg</bedeutung>
    </bedeutungsposition>
    <bedeutungsposition nr="2">
      <bedeutung>japoisdfoiasjdfoasjdfl</bedeutung>
    </bedeutungsposition>
  </artikel>
</root>

В этом примере узел <lemma> содержит «Abend», и это должно быть значение для группировки.

желаемый результат:

<root>
  <artikel>
    <lemma-position>
      <lemma>Abend</lemma>
      <info>aaa</info>
      <info>bbb</lemma>
    </lemma-position>
    <bedeutungsposition nr="1">
      <bedeutung>abcdefg</bedeutung>
    </bedeutungsposition>
    <bedeutungsposition nr="1a">
      <bedeutung>Zeit am Ende des Tages</bedeutung>
    </bedeutungsposition>
    <bedeutungsposition nr="1b">
      <bedeutung>
        was anderes
      </bedeutung>
    </bedeutungsposition>
    <bedeutungsposition nr="2">
      <bedeutung>japoisdfoiasjdfoasjdfl</bedeutung>
    </bedeutungsposition>
  </artikel>
</root>

То, что я получаю, - это неслитая копия, то есть XML-вход, или его часть, но не объединенная вообще. К настоящему времени я пробовал несколько вещей, из которых база всегда выглядит примерно так:

<xsl:template match="/">
  <xsl:copy>
    <xsl:for-each-group select="artikel" group-by="//lemma">
      <xsl:copy-of select="current-group()//lemma/*" />
      <!--
        I also placed some other paths and expressions here or above to 
        select the elements differently, without success however.  
      -->
    </xsl:for-each-group>

  </xsl:copy>
</xsl:template>

Я также пробовал xQuery с distinct-values и т. д., но это тоже не сработало (без дубликатов).

Я тестирую с Oxygen и baseX, оба подключаются к Saxon-9.8 HE, так что на самом деле все должно быть в порядке. Решение в XSLT будет оценено так же, как и решение в xQuery.

05.06.2019

Ответы:


1

Я думаю, что основным шаблоном будет

  <xsl:template match="root">
      <xsl:copy>
          <xsl:for-each-group select="artikel" group-by="lemma-position/lemma">
              <xsl:copy>
                  <lemma-position>
                      <lemma>
                          <xsl:value-of select="current-grouping-key()"/>
                      </lemma>
                      <xsl:apply-templates select="current-group()/lemma-position/(* except lemma)"/>
                  </lemma-position>
                  <xsl:apply-templates select="current-group()/(* except lemma-position)">
                      <xsl:sort select="@nr"/>
                  </xsl:apply-templates>
              </xsl:copy>
          </xsl:for-each-group>
      </xsl:copy>
  </xsl:template>

вместе с преобразованием идентичности (например, в XSLT 3, объявленном xsl:mode on-no-match="shallow-copy") вы получаете https://xsltfiddle.liberty-development.net/gWvjQfR:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math"
    xmlns:map="http://www.w3.org/2005/xpath-functions/map"
    xmlns:array="http://www.w3.org/2005/xpath-functions/array"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="root">
      <xsl:copy>
          <xsl:for-each-group select="artikel" group-by="lemma-position/lemma">
              <xsl:copy>
                  <lemma-position>
                      <lemma>
                          <xsl:value-of select="current-grouping-key()"/>
                      </lemma>
                      <xsl:apply-templates select="current-group()/lemma-position/(* except lemma)"/>
                  </lemma-position>
                  <xsl:apply-templates select="current-group()/(* except lemma-position)">
                      <xsl:sort select="@nr"/>
                  </xsl:apply-templates>
              </xsl:copy>
          </xsl:for-each-group>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

В BaseX XQuery вы можете использовать

<root>
{
    for $artikel in root/artikel
    group by $lemma := $artikel/lemma-position/lemma
    return
        <artikel>
           <lemma-position>
             <lemma>{$lemma}</lemma>
             {
                 $artikel/lemma-position/(* except lemma)
             }
           </lemma-position>
           {
               sort($artikel/(* except lemma-position), (), function($el) { $el/@nr })
           }
        </artikel>
}
</root>
05.06.2019
  • большое спасибо, Мартин! Это работает как шарм и не так сложно. Потрясающий :) 05.06.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..