Как я могу скопировать все содержимое в элементе <p>без тегов <span>, но не их содержимое - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть некоторый HTML, который выглядит так:

<div>
  <p><span class="selected-for-presentation">This is a <u><em><strong>very cool</strong></em></u> sentence...</span></p>
  <p>This is a <u><em><strong><span class="selected-for-presentation">very</span> cool</strong></em></u> sentence...</p>
</div>

и я пытаюсь написать XSLT, который копирует полное содержание абзацев, опуская теги <span>, но не их содержимое. Поэтому результат должен выглядеть примерно так:

<div>
  <p>This is a <u><em><strong>very cool</strong></em></u> sentence...</p>
  <p>This is a <u><em><strong>very cool</strong></em></u> sentence...</p>
</div>

Это мой XSLT, который работает для первого абзаца, но не для второго:

<xsl:template match="p">
  <p>
    <xsl:apply-templates mode="copy_span_content"/>
  </p>
</xsl:template>

<xsl:template match="strong" mode="copy_span_content">
  <xsl:apply-templates mode="copy_span_content"/>
</xsl:template>

<xsl:template match="em" mode="copy_span_content">
  <xsl:apply-templates mode="copy_span_content"/>
</xsl:template>

<xsl:template match="u" mode="copy_span_content">
  <xsl:apply-templates mode="copy_span_content"/>
</xsl:template>

<xsl:template match="span" mode="copy_span_content">
  <xsl:copy-of select="./node()"/>
</xsl:template>

Любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 12 апреля 2019

Существует гораздо более простой подход, если вы просто хотите удалить span и оставить все остальное, то есть использовать Identity Template для копирования всего и иметь переопределенный шаблон для пропускаspan, но продолжайте обработку его потомков.

Попробуйте это

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:output method="xml" />

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

  <xsl:template match="span">
    <xsl:apply-templates />
  </xsl:template>
</xsl:stylesheet>
0 голосов
/ 12 апреля 2019

Благодаря предложению Тима С ( см. Ниже ) я нашел решение, которое работает идеально.Я не мог сделать это так же просто, как и совет, поскольку HTML-файл, с которым я работаю, более сложен, чем предоставленный мной фрагмент, и мой XSLT-файл импортируется в более крупный файл, и я не хочу, чтобы шаблон идентификации применялся кдругие элементы.

Решение, которое я придумал:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="p[descendant::span]">
        <xsl:apply-templates select="." mode="copy_without_span_tags"/>
        <!-- There is more stuff that goes in here in my actual template.-->
    </xsl:template>

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

    <xsl:template match="span" mode="copy_without_span_tags">
        <xsl:apply-templates/>
    </xsl:template>

</xsl:stylesheet>
...