XSLT 'apply-templates' и 'apply-templates with mode' за один раз

Я пытаюсь использовать apply-templates и apply-templates с mode, как описано в следующем примере:

Мой входной XML выглядит так:

<catalog>
<product dept="aaa">
    <number>111</number>
    <name>cap</name>
    <color>blue</color>
</product>
<product dept="bbb">
    <number>222</number>
    <name>bat</name>
    <color>white</color>
</product>
<product dept="ccc">
    <number>333</number>
    <name>bag</name>
    <color>red</color>
</product>

Теперь я пытаюсь с помощью показанного ниже xslt удалить элемент product с помощью dept=bbb, но он не работает. Тот же самый входной xml появляется в выходных данных. Я знаю, что могу достичь желаемого результата, удалив атрибут mode в последнем шаблоне, но я пытаюсь понять, почему он не работает так, как я здесь пытаюсь.

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" version="1.0" exclude-result-prefixes="exsl">
  <xsl:template match="/">
    <xsl:variable name="modXml">
      <xsl:apply-templates />
      <xsl:apply-templates mode="remove" />
    </xsl:variable>
    <xsl:copy-of select="exsl:node-set($modXml)/*" />
  </xsl:template>
  <xsl:template match="node( ) | @*">
    <xsl:copy>
      <xsl:apply-templates select="@*" />
      <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>
  <xsl:template match="/catalog/product[@dept='bbb']" mode="remove" />
</xsl:stylesheet>

Может кто-нибудь объяснить, пожалуйста, как процессор XSLT выполняет преобразование здесь..?

Большое спасибо..!

1 ответ

Решение

Вот:

<xsl:variable name="modXml">
      <xsl:apply-templates />
      <xsl:apply-templates mode="remove" />
</xsl:variable>

Когда вы делаете первый:

<xsl:apply-templates />

Вы применяете шаблон преобразования идентификаторов ко всем узлам (рекурсивно) в документе. Как только это будет сделано, переменная уже содержит копию всего документа. Ничто из того, что вы будете делать с этого момента, не изменит этого.

Затем, когда вы делаете:

<xsl:apply-templates mode="remove" />

Вы добавляете к существующему фрагменту дерева результатов переменной. Оказывается, примененный шаблон на самом деле ничего не добавляет, но и ничего не удаляет из уже существующего результата. Там нет никакого способа сделать это.

Другие вопросы по тегам