Прохождение пустых строк после удаления узлов с помощью XSLT - программирование
Подтвердить что ты не робот

Прохождение пустых строк после удаления узлов с помощью XSLT

Я использую XSLT, чтобы сделать очень простое преобразование в документе XML. Я просто хочу удалить все узлы элементов с определенным именем. Бывает, что в моем исходном документе все эти узлы расположены в конце документа, но после преобразования, хотя узлы исчезли, как я и предполагал, на их месте появилось много пустых строк.

Это строго косметическая проблема, так как я выполнил то, что хотел с преобразованием, но из любопытства: как я могу избавиться от этих пустых строк? Это XSL файл, который я использовал для преобразования (элемент, который я хотел удалить, называется "отношения" ):

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" />

  <xsl:template match="*">
    <xsl:copy>
      <xsl:copy-of select="@*" />
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="relation"/>

</xsl:stylesheet>
4b9b3361

Ответ 1

Причина в текстовых узлах только для пробелов, которые являются непосредственными братьями и сестрами для удаленных элементов.

Решение. Просто добавьте эту инструкцию XSLT, чтобы удалить любые текстовые узлы только с пробелом - еще до начала преобразования:

 <xsl:strip-space elements="*"/>

Результат может потерять отступ - если да, добавьте это:

 <xsl:output omit-xml-declaration="yes" indent="yes"/>

Полное преобразование становится:

<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="*">
        <xsl:copy>
            <xsl:copy-of select="@*" />
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="relation"/>
</xsl:stylesheet>

при применении к этому XML-документу (ни один не предоставлен!):

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>

  <relation/>
  <relation/>
  <relation/>
  <relation/>
  <relation/>
  <relation/>
  <relation/>
  <relation/>
</nums>

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

<nums>
   <num>01</num>
   <num>02</num>
   <num>03</num>
   <num>04</num>
   <num>05</num>
   <num>06</num>
   <num>07</num>
   <num>08</num>
   <num>09</num>
   <num>10</num>
</nums>