Механизм для удаления определенных тегов из документа XHTML (но сохранить их содержимое)? - PullRequest
1 голос
/ 05 сентября 2010

Я хотел бы получить краткий и простой способ вырезать теги из документа XHTML и считаю, что должно быть что-то достаточно короткое среди всех опций, таких как: XSLT, XPath, XQuery, пользовательское программирование на C # с использованием пространства имен XML .NET.Я открыт для других.

Например, , я хочу удалить все теги <b> из документа XHTML, но сохранить их внутреннее содержимое идочерние теги (т. е. не просто пропустить жирный тег и его дочерние элементы).

Мне нужно сохранить структуру исходного документа за вычетом вырезанных тегов.

Мысли:

  • Я видел способность XSLT сопоставлять элементы для выбора;однако я хочу сопоставить все по умолчанию с несколькими исключениями, и я не уверен, что это способствует этому.Это то, на что я сейчас смотрю.

  • XQuery Я еще не начал изучать.( Обновление для XQuery : кратко рассмотрел эту технологию, и она достаточно сравнима с SQL по функции, поэтому мне не удается понять, как она может поддерживать структуру вложенных узлов исходного документа - я думаю, что это неПретендент).

  • Пользовательская C # /. NET XML namespace программа может быть жизнеспособной, так как у меня уже есть идея, но мое непосредственное предположение, скорее всего, большеучастие в контрасте с причинами, по которым были созданы эти другие специфичные для XML языки соответствия.

  • ... другой вид технологии включения Я еще не рассматривал ...

1 Ответ

3 голосов
/ 05 сентября 2010

Мне нужно сохранить структуру исходного документа за вычетом лишенных тегов

Вы думали о XSLT?Это язык, специально разработанный для преобразования XML и вообще древовидных структур.

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="b">
  <xsl:apply-templates/>
 </xsl:template>
</xsl:stylesheet>

при применении к любому документу XHTML, какодин ниже :

<html>
 <head/>
 <body>
  <p> Hello, <b>World</b>!</p>
 </body>
</html>

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

<html>
   <head/>
   <body>
      <p> Hello, World!</p>
   </body>
</html>
...