将xsl元素从一个节点复制到另一个节点

时间:2014-03-26 11:17:48

标签: xml xslt

我想将一个元素从一个节点复制到另一个节点。例如,我的输入xml如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Institutions>
   <Schools>
      <schoolOne>schoolOne</schoolOne>
      <scholTwo>scholTwo</scholTwo>
   </Schools>
   <Colleges>
      <CollegeOne>CollegeOne</CollegeOne>
      <CollegeTwo>CollegeTwo</CollegeTwo>
   </Colleges>
</Institutions>

我想在<CollegeTwo>CollegeTwo</CollegeTwo>节点下移动<Schools>。  即我的输出xml应如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Institutions>
   <Schools>
      <schoolOne>schoolOne</schoolOne>
      <scholTwo>scholTwo</scholTwo>
      <CollegeTwo>CollegeTwo</CollegeTwo>
   </Schools>
   <Colleges>
      <CollegeOne>CollegeOne</CollegeOne>
      <CollegeTwo>CollegeTwo</CollegeTwo>
   </Colleges>
</Institutions>

任何帮助实现这一点是值得赞赏的。 提前谢谢。

我尝试使用以下代码,但它不适用于我。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:template match="@* | node()">
      <xsl:copy>
         <xsl:apply-templates select="@* | node()" />
      </xsl:copy>
   </xsl:template>
   <xsl:template match="/">
      <xsl:copy>
         <xsl:apply-templates select="//Colleges/CollegeTwo" />
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:2)

您已通过加入身份转换

开始走上正轨
<xsl:template match="@* | node()">
   <xsl:copy>
      <xsl:apply-templates select="@* | node()" />
   </xsl:copy>
</xsl:template>

就其本身而言,这将按原样复制节点,这意味着您只需要为要更改的节点编写模板(XSLT将优先考虑与特定元素匹配的模板)

在您的情况下,您想要将新子项添加到学校元素,因此您需要更改第二个模板以匹配此元素(正如您当前所做的那样匹配/将匹配文档节点,在这种情况下,这不是您想要的。)

 <xsl:template match="Schools">

您已经有了复制 CollegeTwo 元素的代码,但此时您还需要确保学校的现有子节点也被复制。 ( xsl:copy 复制当前节点,但不复制其属性或子节点。

试试这个XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:output method="xml" indent="yes" />

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

   <xsl:template match="Schools">
      <xsl:copy>
         <xsl:apply-templates select="@* | node()" />
         <xsl:apply-templates select="//Colleges/CollegeTwo" />
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>