Интересно, как объединить/группировать/объединить 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.