#xml #xslt
#xml #xslt
Вопрос:
У меня следующая структура 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>
Комментарии:
1. Поддерживает ли ваш процессор XSLT 2.0?
2. К сожалению, нет
Ответ №1:
Предполагая регулярную структуру (все 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>
Комментарии:
1. Большое вам спасибо, за ваш ответ я очень благодарен.
Ответ №2:
Здесь вы делаете две вещи: дедуплицируете имя элемента, проверяя, все ли они имеют одинаковые значения.
Эта таблица стилей
<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>
Обратите внимание: группировка для дедупликации, сравнение наборов узлов являются существующими (таким образом, все они одинаковы, если нет ни одного, который отличается)
Комментарии:
1. Большое вам спасибо, за ваш ответ я очень благодарен.