2012-04-19 5 views
2

Я пытаюсь использовать XSLT для добавления context-param в качестве последнего родного брата. Нет общего элемента родительского элемента, поэтому задача немного сложнее.XSLT - append sibling

Я хотел бы добавить следующий элемент:

<context-param> 
    <param-name>miku</param-name> 
    <param-value>kawaii</param-value> 
</context-param> 

в качестве последнего context-param элемента (., Например, все context-param элементы должны быть рядом друг с другом, они не могут быть разбросаны где-нибудь в XML) в следующем XML:

<web-app> 
    <not_interesting_element1/> 
    <not_interesting_element2/> 

    <context-param> 
    <param-name>not_interesting_param_key1</param-name> 
    <param-value>kawaii</param-value> 
    </context-param> 
    <context-param> 
    <param-name>not_interesting_param_key2</param-name> 
    <param-value>kawaii</param-value> 
    </context-param> 
    <context-param> 
    <param-name>parameterThatsGuaranteedToBeHere</param-name> 
    <param-value>someValue</param-value> 
    </context-param> 


    <not_interesting_element3/> 
    <not_interesting_element4/> 
    <!-- ... servlets, ... --> 
</web-app> 

результат должен выглядеть следующим образом:

<web-app> 
    <not_interesting_element1/> 
    <not_interesting_element2/> 

    <context-param> 
    <param-name>not_interesting_param_key1</param-name> 
    <param-value>kawaii</param-value> 
    </context-param> 
    <context-param> 
    <param-name>not_interesting_param_key2</param-name> 
    <param-value>kawaii</param-value> 
    </context-param> 
    <context-param> 
    <param-name>parameterThatsGuaranteedToBeHere</param-name> 
    <param-value>someValue</param-value> 
    </context-param> 
    <context-param> 
     <param-name>miku</param-name> 
     <param-value>kawaii</param-value> 
    </context-param> 

    <not_interesting_element3/> 
    <not_interesting_element4/> 
    <!-- ... servlets, ... --> 
</web-app> 

Как я мог это сделать?

+0

Добавить к чему? Пожалуйста, отредактируйте вопрос и предоставите XML-документ и конкретные узлы сестер, к которым вы хотите добавить элемент 'context-param'. Затем сообщите мне через комментарий. –

+0

Пожалуйста, отправьте образцы ввода и желаемого выходного XML, иллюстрирующие проблему. –

+0

@Dimitre Novatchev: Вопрос обновлен. – woky

ответ

2

Это преобразование:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="pElemToAdd"> 
    <context-param> 
     <param-name>miku</param-name> 
     <param-value>kawaii</param-value> 
    </context-param> 
</xsl:param> 

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

<xsl:template match="context-param[last()]"> 
    <xsl:call-template name="identity"/> 
    <xsl:copy-of select="$pElemToAdd"/> 
</xsl:template> 
</xsl:stylesheet> 

применительно к предоставленному документу XML:

<web-app> 
    <not_interesting_element1/> 
    <not_interesting_element2/> 
    <context-param> 
     <param-name>not_interesting_param_key1</param-name> 
     <param-value>kawaii</param-value> 
    </context-param> 
    <context-param> 
     <param-name>not_interesting_param_key2</param-name> 
     <param-value>kawaii</param-value> 
    </context-param> 
    <context-param> 
     <param-name>parameterThatsGuaranteedToBeHere</param-name> 
     <param-value>someValue</param-value> 
    </context-param> 
    <not_interesting_element3/> 
    <not_interesting_element4/> 
    <!-- ... servlets, ... --> 
</web-app> 

производит разыскиваемого, правильный результат:

<web-app> 
    <not_interesting_element1/> 
    <not_interesting_element2/> 
    <context-param> 
     <param-name>not_interesting_param_key1</param-name> 
     <param-value>kawaii</param-value> 
    </context-param> 
    <context-param> 
     <param-name>not_interesting_param_key2</param-name> 
     <param-value>kawaii</param-value> 
    </context-param> 
    <context-param> 
     <param-name>parameterThatsGuaranteedToBeHere</param-name> 
     <param-value>someValue</param-value> 
    </context-param> 
    <context-param> 
     <param-name>miku</param-name> 
     <param-value>kawaii</param-value> 
    </context-param> 
    <not_interesting_element3/> 
    <not_interesting_element4/><!-- ... servlets, ... --> 
</web-app> 

Объяснение:

  1. Идентичность копирует правило каждый узел "как есть".

  2. Существует один шаблон, переопределяющий шаблон идентификации. Этот шаблон соответствует последнему элементу context-param всех элементов context-param, являющихся дочерними элементами их родительского элемента.

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

+0

Спасибо. Это работает, если я добавляю один элемент. Если я делаю это многократно, добавленный элемент также перезаписывает предыдущий элемент, поэтому он выглядит так, как будто последний элемент «context-path» удален и добавляются два новых элемента. – woky

+0

@woky: Если вы хотите добавить более одного узла, вы должны указать полный набор узлов, который будет добавлен в параметр. –

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