【问题标题】:XSLT - append siblingXSLT - 追加同级
【发布时间】:2012-04-30 22:11:18
【问题描述】:

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

我想添加以下元素:

<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>

请问我该怎么做?

【问题讨论】:

  • 追加到什么?请编辑问题并提供 XML 文档和特定的兄弟节点,您希望将 context-param 元素附加到这些节点。然后通过评论通知我。
  • 请发布说明问题的输入和所需输出 XML 示例。
  • @Dimitre Novatchev:问题已更新。

标签: xml xslt append flat siblings


【解决方案1】:

这种转变:

<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. 在覆盖模板中执行了两个操作;当前节点通过对身份规则的调用被复制;然后将要附加的元素复制到输出。为了方便和灵活,我们假设要附加的元素作为参数传递给转换。

【讨论】:

  • 谢谢。如果我附加一个元素,这将有效。如果我重复执行此操作,附加的元素也会重写前一个元素,因此看起来最后一个 context-path 元素被删除并附加了两个新元素。
  • @woky:如果要追加多个节点,则必须在参数中指定要追加的完整节点集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 2017-08-30
  • 2016-10-24
  • 1970-01-01
相关资源
最近更新 更多