Удаление элементов с использованием XSLT - PullRequest
1 голос
/ 29 апреля 2020

Итак, я искал inte rnet уже несколько дней и, похоже, не могу найти ничего, что определило бы c для моей проблемы. Мне нужно удалить элемент, используя преобразование XSLT, когда я получаю совпадение. У меня есть выражение XPath, которое сравнивает извлечение базы данных и извлечение API и определяет совпадения между ними. Я пытаюсь использовать совпадения и удалить их из общей выдержки API. Мои извинения, если я пропустил любую необходимую информацию, я все еще довольно новичок в XSLT.

Текущий XML формат:

<names>
  <name>one</name>
  <name>two</name>
  <name>three</name>
  <name>four</name>
</names>

Желаемый XML Выход:

<names>
  <name>one</name>
  <name>two</name>
  <name>four</name>
</names>

В этом случае, скажем, я получил совпадение «три» преобразование XSLT удалит «три» из XML.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Если xmlstarlet недоступно, вы можете использовать следующую таблицу стилей XSL:

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

  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="@*|node()">
    <!-- identity transformation -->
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="name[text() = 'three']"/>
    <!-- do nothing, i.e. delete from output -->

</xsl:stylesheet>
0 голосов
/ 29 апреля 2020

Если вы хотите избежать трудностей при написании XSL-программы, предполагая, что в вашей системе установлено xmlstarlet и ваш XML файл называется names.xml, вы можете просто выполнить:

xmlstarlet edit --delete '//name[text() = "three"]' names.xml
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...