xslt(1.0):将子节点添加到最外层元素?

时间:2012-12-04 14:40:42

标签: xslt identity

努力工作这个;我有一个(Tomcat6'Context.xml')默认文档,基本上是这样的:

<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>

我想添加'Resource'和'Environmment作为最外层Context节点的子节点;所以我最终得到:

<Context>
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <Resource name="abc"[...]/>
    <Environment name="xyz"[...]/>
</Context>

使用XSLT 1.0。

(我还想避免假设节点'WatchedResource'出现在文档中。)

2 个答案:

答案 0 :(得分:2)

<xsl:param name="new">
  <Resource name="abc..."/>
  <Environment name="xyz..."/>
</xsl:param>

<xsl:template match="Context">
  <xsl:copy>
    <xsl:copy-of select="@* | node()"/>
    <xsl:copy-of select="$new"/>
  </xsl:copy>
</xsl:template>

应该足够了。

答案 1 :(得分: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:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="/*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
    <Resource name="abc"/>
    <Environment name="xyz"/>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档时:

<Context>
  <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>

会产生想要的正确结果:

<Context>
   <WatchedResource>WEB-INF/web.xml</WatchedResource>
   <Resource name="abc"/>
   <Environment name="xyz"/>
</Context>

请注意:不依赖于现有元素名称的名称以及文档中是否存在顶级元素的子元素数。