Удалить определенные узлы в копии узла - PullRequest
0 голосов
/ 11 июня 2018

Как мне скопировать весь элемент, но удалить только некоторые дочерние элементы?Я хочу скопировать div#about, но хочу удалить из него элементы table.

Ввод HTML:

<html>
  <body>
    <div class="content-header">
      <h1>Title</h1>
    </div>
    <div id="about">
      <h1>About</h1>
      <table>...</table>
      <p>Bla bla bla</p>
      <table>...</table>
      <p>The end</p>
    </div>
  </body>
</html>

XSLT:

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <div class="article">
            <h1>
              <xsl:value select="//div[@class='content-header']/h1/text()"/>
            </h1>

            <div>
                <xsl:copy-of select="//div[@id='about']"/>
               <!-- Here should render the entire div#about without the tables -->
            </div>

        </div>
    </xsl:template>

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

1 Ответ

0 голосов
/ 11 июня 2018

Сначала добавьте шаблон идентификации в ваш XSLT

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

(Или, если вы используете XSLT 3.0, вы можете использовать <xsl:mode on-no-match="shallow-copy"/> вместо этого)

Затем добавьте другой шаблон, чтобы игнорироватьtable элементы

<xsl:template match="div[@id='about']/table" />

И, наконец, замените ваш xsl:copy-of на xsl:apply-templates, чтобы обеспечить сопоставление этих шаблонов, таким образом гарантируя, что элементы table не будут скопированы.

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

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="yes" omit-xml-declaration="yes"/>

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

    <xsl:template match="div[@id='about']/table" />

    <xsl:template match="/">
        <div class="article">
            <h1>
              <xsl:value-of select="//div[@class='content-header']/h1/text()"/>
            </h1>
            <div>
                <xsl:apply-templates select="//div[@id='about']"/>
            </div>
        </div>
    </xsl:template>
</xsl:transform>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...