使用xslt在XML文件中移动元素

时间:2014-11-22 22:15:25

标签: xml xslt

我有一个看起来像这样的XML文件,

 <XML>
   <article article-type="research">
   <article-meta>
   <abstract>
      <p> lorisum......</p>
   </abstract>
   <abstract abstract-type="summary">
      <p>lorisum summary</p>
   </abstract>
   </article-meta>

   <body>
    <sec>
     <p>
      ......
     </p>
    </sec>
    <sec sec-type="clinical">
     <p> clinical test</p>
    </sec>
    </body>
    </article>
    <XML>

问题是我如何使用xslt将临床sec移动到无类型抽象中?

1 个答案:

答案 0 :(得分:1)

您可以像这样移动临床秒:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:template match="/">
    <xsl:copy>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="abstract[not(@abstract-type)]">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
      <xsl:copy-of select="//sec[@sec-type='clinical']"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="sec[@sec-type='clinical']"/>
</xsl:stylesheet>

输出:

<XML>
  <article article-type="research">
    <article-meta>
        <abstract>
            <p> lorisum......</p>
            <sec sec-type="clinical">
                <p> clinical test</p>
            </sec>
        </abstract>
        <abstract abstract-type="summary">
            <p>lorisum summary</p>
        </abstract>
    </article-meta>
    <body>
        <sec>
            <p>
                ......
            </p>
        </sec>
    </body>
  </article>
</XML>

模板只复制原始输入XML中的所有内容。匹配sec[@sec-type='clinical']的模板为空,因此此部分将从此副本中删除。与abstract没有abstract-type属性匹配的模板 - abstract[not(@abstract-type)] - 复制摘要并添加sec[@sec-type='clinical']的副本。