Как я могу удалить строки в файле XML - PullRequest
0 голосов
/ 17 ноября 2010

Рассмотрим следующее содержимое файла XML:

<catalog>
  <cd>
        <title>Red</title>
        <artist>The Communards</artist>
  </cd>
  <cd>
        <title>Unchain my heart</title>
        <artist>Joe Cocker</artist>
  </cd>
</catalog>

Как я могу получить следующее с любым существующим инструментом или XSLT?

<catalog>
  <cd><title>Red</title><artist>The Communards</artist></cd>
  <cd><title>Unchain my heart</title><artist>Joe Cocker</artist></cd>
</catalog>

Я хочу сделать это преобразование, потому что я хочу быстро удалить некоторые записи (в данном случае 'cd') из файла XML Использование однострочного формата помогло бы мне.

Спасибо!

Ответы [ 5 ]

4 голосов
/ 17 ноября 2010

Я хочу сделать это преобразование потому что я хочу удалить некоторые записи (в данном случае 'cd') быстро из XML-файл. Использование однострочного формата помог бы мне.

Извините, но это неправильный подход. Вы хотите использовать XSLT для манипулирования пробелами в своем документе, чтобы упростить удаление ошибочных строк с помощью ... чего-то, что не является XSLT? Просто удалите ненужные строки с помощью XSLT!

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

<xsl:stylesheet version="1.0">

  <!-- this is called the identity transform - it will copy the input wholesale -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- this template will provide the exception case for "cd" nodes and effectively remove them -->
  <xsl:template match="cd">
    <!-- do nothing with it! -->
  </xsl:template>

</xsl:stylesheet>
2 голосов
/ 18 ноября 2010

Странный запрос (не семантические различия) ... Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="no" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="@*|node()" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="cd">
        <xsl:text>&#xA;&#x9;</xsl:text>
        <xsl:call-template name="identity"/>
        <xsl:value-of select="substring('&#xA;', 1 div (position()=last()))"/>
    </xsl:template>
</xsl:stylesheet>

Выход:

<catalog>
    <cd><title>Red</title><artist>The Communards</artist></cd>
    <cd><title>Unchain my heart</title><artist>Joe Cocker</artist></cd>
</catalog>

Примечание: Правило идентификации, xsl: strip-space (обрезает все текстовые узлы), добавляет новую строку и табуляцию для cd и новую строку для последней cd.

1 голос
/ 17 ноября 2010

Протестировано:

Вот решение:

<xsl:stylesheet 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output indent="no" method="xml"/>
<xsl:strip-space elements="cd title artist"/>

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

</xsl:stylesheet>

Ключ заключается в том, чтобы гарантировать, что вывод не имеет автоматического отступа, а затем указать, какие элементы должны удалить пробелы, такие как cd, title и artist.

0 голосов
/ 18 ноября 2010

Я хочу сделать это преобразование потому что я хочу удалить некоторые записи (в данном случае 'cd') быстро из XML-файл. Использование однострочного формата помог бы мне.

Не проще ли было бы просто удалить нужные "записи" из XML с помощью XSLT? Это было бы проще, чем изменить разрывы / пробелы с помощью XSLT, а затем использовать что-то еще, чтобы удалить то, что вам не нужно. (Что вы планировали использовать? Собирались ли вы удалить все строки, которые начинались с <cd>?)

В XSLT просто отбрасывать ненужные данные, если вы используете преобразование идентичности. Вы можете добавить пустой шаблон для всего, что не хотите хранить.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

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

  <xsl:template match="cd"/>

</xsl:stylesheet>

Используя ваш ввод XML, эта таблица стилей выдаст следующий вывод:

<?xml version="1.0" encoding="UTF-8"?>
<catalog/>
0 голосов
/ 17 ноября 2010

Если вы хотите отформатировать произвольно большие потоки (xslt использует модель в памяти), вы можете прочитать его в программе чтения событий Stax и просто записать их снова, отбрасывая события пробела и вставляя событие новой строки, когда вы сталкиваетесь скаталог или событие конца элемента CD.Вы даже можете просто удалить этот шаг и игнорировать события cd, которые вас не интересуют при записи результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...