Очистите нежелательные пространства имен с помощью LibXML-Ruby - PullRequest
1 голос
/ 27 августа 2009

Я хотел бы проанализировать ленту Atom и создать Atom-совместимый кеш для каждой записи.

Проблема в том, что некоторые каналы (, например, ) имеют много пространств имен, кроме Atom.

Можно ли сохранить нетронутыми все узлы Atom и удалить каждый узел, принадлежащий другому пространству имен?

Примерно так:

valid_nodes = entry.find('atom:*', '/atom:feed/atom:entry')
# now I need to create an xml string with valid_nodes, but how I do that?

1 Ответ

2 голосов
/ 27 августа 2009

В XSLT вы можете использовать это преобразование:

<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns="http://www.w3.org/2005/Atom"
>
  <xsl:output method="xml" indent="yes" encoding="utf-8" />

  <xsl:template match="node() | @*">
    <xsl:if test="
      namespace-uri() = ''
      or
      namespace-uri() = 'http://www.w3.org/2005/Atom'
    ">
      <xsl:copy>
        <xsl:apply-templates select="node() | @*" />
      </xsl:copy>
    </xsl:if>
  </xsl:template>

  <xsl:template match="text()|comment()">
    <xsl:copy-of select="." />
  </xsl:template>
</xsl:stylesheet>

Копирует все узлы дословно, если они

  • в пространстве имен по умолчанию (пусто)
  • в пространстве имен Atom
  • текстовые узлы или комментарии

Может быть, вы можете использовать это.

...