У меня возникла проблема с обнаружением повторяющегося значения элемента и удалением узла.
XML:
<library>
<books>
<name>Learn XSLT</name>
<id>1</id>
</books>
<books>
<name>Learn Java</name>
<id>3</id>
</books>
<books>
<name>Learn XSLT</name>
<id>2</id>
</books>
</library>
Я хочу сохранить повторяющуюся запись, то есть <name>Learn XSLT</name>
и <id>2</id>
, в переменной и удалить этот узел книг из XML.
Я застрял в том, как найти эти дубликаты.
ожидаемый результат переменная, содержащая
<books>
<name>Learn XSLT</name>
<id>2</id>
</books>
вывод XML
<library>
<books>
<name>Learn XSLT</name>
<id>1</id>
</books>
<books>
<name>Learn Java</name>
<id>3</id>
</books>
</library>
я использую xslt
Если у вас есть xsl:param
, содержащий структуру XML для поиска (или выбранную откуда-то, например, из внешнего документа), вы можете удалить элементы, в которых все его дочерние элементы соответствуют дочерним элементам элемента xsl:param
, используя deep-equal()
для выполнения сравнения. .
Использование преобразование идентичности со специализированным шаблоном для соответствия удаляемому элементу:
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
version = "2.0">
<xsl:output indent = "yes"/>
<xsl:param name = "filter">
<books>
<name>Learn XSLT</name>
<id>2</id>
</books>
</xsl:param>
<xsl:template match = "@*|node()">
<xsl:copy>
<xsl:apply-templates select = "@*|node()"/>
</xsl:copy>
</xsl:template>
<!--if all of the matched element's children are deep equal to the $filter element's children,
then remove it -->
<xsl:template match = "*[deep-equal(*, $filter/*/*)]"/>
</xsl:stylesheet>
Но у меня может быть много дубликатов, а не один. Я не могу все поставить в параметры?
Было бы полезно, если бы вы включили эти подробности в вопрос, но самый простой способ узнать это - попробовать.
это как будто мне нужно удалить <books> <name> Learn XSLT </name> <id> 2 </id> </books>
Какой язык программирования вы используете?