2012-04-19 109 views
2

我试图使用XSLT将context-param作为最后一个兄弟。没有共同的父元素,所以任务有点困难。XSLT - 追加兄弟

我想追加以下元素:

<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'元素。然后通过评论通知我。 – 2012-04-19 11:56:14

+0

请发布说明问题的输入和期望输出XML样本。 – 2012-04-19 11:56:30

+0

@Dimitre Novatchev:问题已更新。 – woky 2012-04-19 12:11:19

回答

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 2012-04-19 12:29:58

+0

@woky:如果要附加多个节点,则必须指定要在参数中附加的完整节点集。 – 2012-04-19 12:32:49