2015-09-10 2 views
0

Я пытаюсь использовать применяемые-шаблоны и применять-шаблоны с режимом, как описано в примере ниже: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-процессор здесь? ..

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

ответ

0

Здесь:

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

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

<xsl:apply-templates /> 

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

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

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

вы добавление к переменной Существующий результат дерево-фрагмент. Как бы то ни было, применяемый шаблон фактически ничего не добавляет, но и он не удаляет ничего из уже существующего результата. Это невозможно.

+0

Значит ли это, что любые последующие xsl: apply-templates после первого xsl: apply-templates не будут иметь никакого эффекта внутри объявления переменной? При попытке этого: также дает тот же результат, что и мой первоначальный код. Согласно вашему высказыванию, он должен удалить тег продукта с помощью dept = "bbb" при применении первых xsl: apply-templates, а затем игнорировать второй xsl: apply-templates, right ..? – Lokesh

+0

№. Шаблон не действительно «удаляет» что-либо. Это всего лишь метафора. Шаблон записывает (или не записывает) в результирующее дерево независимо от любого другого шаблона. Чтобы иметь эффект «удаления», у вас должно быть (по крайней мере) два шаблона: общий, который копирует все, и конкретный, который не копирует определенные узлы. Когда вы применяете их ** вместе ** (и в том же режиме), тогда более конкретный шаблон имеет приоритет, а общий шаблон ** не применяется ** к конкретным узлам. В вашем случае есть два этапа: сначала скопируйте все, а затем ничего не копируйте. –

+0

Как я уже упоминал в своем предыдущем комментарии, заметили ли вы, что я изменил порядок xsl: применяемые шаблоны (т. Е. С «режимом» записываются первым, а затем общим) во второй попытке? – Lokesh

Смежные вопросы