Я пытаюсь использовать применяемые-шаблоны и применять-шаблоны с режимом, как описано в примере ниже:XSLT «применить-шаблоны» и «применить-шаблоны с режимом» в один идти
Мой вход 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 для удаления элемента продукта с = отдел ГЭБ, но она не работает. На выходе появляется тот же вход 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-процессор здесь? ..
Большое спасибо ..!
Значит ли это, что любые последующие xsl: apply-templates после первого xsl: apply-templates не будут иметь никакого эффекта внутри объявления переменной? При попытке этого: xsl: variable> также дает тот же результат, что и мой первоначальный код. Согласно вашему высказыванию, он должен удалить тег продукта с помощью dept = "bbb" при применении первых xsl: apply-templates, а затем игнорировать второй xsl: apply-templates, right ..? –
Lokesh
№. Шаблон не действительно «удаляет» что-либо. Это всего лишь метафора. Шаблон записывает (или не записывает) в результирующее дерево независимо от любого другого шаблона. Чтобы иметь эффект «удаления», у вас должно быть (по крайней мере) два шаблона: общий, который копирует все, и конкретный, который не копирует определенные узлы. Когда вы применяете их ** вместе ** (и в том же режиме), тогда более конкретный шаблон имеет приоритет, а общий шаблон ** не применяется ** к конкретным узлам. В вашем случае есть два этапа: сначала скопируйте все, а затем ничего не копируйте. –
Как я уже упоминал в своем предыдущем комментарии, заметили ли вы, что я изменил порядок xsl: применяемые шаблоны (т. Е. С «режимом» записываются первым, а затем общим) во второй попытке? – Lokesh