Как переназначить xml так, чтобы отображались только повторяющиеся значения в узлах - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть следующая структура XML:

<?xml version="1.0" encoding="UTF-8"?>
<nodes>
<Node>
    <a>xxx</a>
    <b>adad</b>
    <c>yyy</c>
    <d>ddwr</d>
    <e>awe</e>
</Node>
<Node>
    <a>xxx</a>
    <b>adaddad</b>
    <c>yyy</c>
    <d>kodoska</d>
    <e>lkadkda</e>
</Node>
<Node>
    <a>xxx</a>
    <b>adase</b>
    <c>yyy</c>
    <d>kodoa.smdkadska</d>
    <e>lkadddadaadsasdkda</e>
</Node>
</nodes>

Я хотел бы сопоставить с xslt, чтобы отображались только узлы с узлами с одинаковыми значениями.Так что я ожидаю что-то вроде этого:

<?xml version="1.0" encoding="UTF-8"?>
<Node>
<a>xxx</a>
<c>yyy</c>
</Node>

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Здесь вы делаете две вещи: дедуплицируете имя элемента, проверяете, все ли они имеют равные значения.

Эта таблица стилей

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:key name="kElement-By-Name" match="Node/*" use="name()"/>
    <xsl:template match="nodes">
        <Node>
            <xsl:for-each 
              select="Node/*[
                generate-id()=generate-id(key('kElement-By-Name',name())[1])
              ]">
                <xsl:copy-of select="(.)[not(. != key('kElement-By-Name',name()))]"/>
            </xsl:for-each>
        </Node>
    </xsl:template>
</xsl:stylesheet>

Выход

<Node>
  <a>xxx</a>
  <c>yyy</c>
</Node>

Обратите внимание : группировка для дедупликации, сравнение наборов узлов являются экзистенциальными (так что все одинаковы, если нет ни одного, который отличается)

0 голосов
/ 18 апреля 2019

Предполагая регулярную структуру (все Node элементы имеют одинаковые дочерние узлы), вы можете сделать:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:key name="node-by-name" match="Node/*" use="name()" />

<xsl:template match="/nodes">
    <Node>
        <xsl:copy-of select="Node[1]/*[not(. != key('node-by-name', name()))]"/>
    </Node>
</xsl:template>

</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...