Найти повторяющиеся значения в XML и удалить узел в XSL - PullRequest
0 голосов
/ 13 сентября 2018

У меня проблема с поиском повторяющегося значения элемента и удалением узла.

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>

1 Ответ

0 голосов
/ 13 сентября 2018

Если у вас есть 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>
...