从某个节点开始的XSLT复制

时间:2014-06-19 15:29:33

标签: xml xslt-1.0

我想使用XSLT将XML文件的一部分移动到另一个节点。 我只想移动某个节点的所有内容。 最好通过一个例子来解释。

这将是输入XML(它只是一个样本)

<Messages>
  <Message>
    <Header>
        <Name>Message Content 1</Name>
    </Header>
    <Info1>
        <Description>blabla</Description>
    </Info1>
    <Info2>
        <Name>Test</Name>
        <Description>blabla</Description>
    </Info2>
    ... Possible more nodes (with random names)
    <Header>
        <Name>Message Content Summary</Name>
    </Header>
    <Info1>
        <Total>blablabla</Total>
    </Info1>
    ... Possible more nodes (with random names)
  </Message>
</Messages>

我想得到以下输出:

<Messages>
  <Message>
    <Header>
        <Name>Message Content 1</Name>
    </Header>
    <Info1>
        <Description>blabla</Description>
    </Info1>
    <Info2>
        <Name>Test</Name>
        <Description>blabla</Description>
    </Info2>
    ... Possible more nodes (with random names)
  </Message>
  <MessageSummary>
    <Header>
        <Name>Message Content Summary</Name>
    </Header>
    <Info1>
        <Total>blablabla</Total>
    </Info1>
    ... Possible more nodes (with random names)
  </MessageSummary>
</Messages>

所以我想将从节点“Header”的最后一次出现开始的所有内容移动到一个单独的节点“MessageSummary”。

有什么方法可以使用XSLT 1.0来实现这个目标吗? 任何帮助将不胜感激。

感谢。

1 个答案:

答案 0 :(得分:2)

因此,当您在输入Message元素的上下文中时,您希望将其后至少有一个Header的任何元素放入输出Message并且MessageSummary内的其他所有内容。您可以将这两种情况区分为*[following-sibling::Header]*[not(following-sibling::Header)],因此,如果我们从标准身份转换开始,我们最终会以

开头
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:strip-space elements="*" />
  <xsl:output indent="yes" />

  <!-- identity template - copies everything as-is unless overridden -->
  <xsl:template match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
  </xsl:template>

  <xsl:template match="Message">
    <xsl:copy>
      <xsl:apply-templates select="*[following-sibling::Header]" />
    </xsl:copy>
    <MessageSummary>
      <xsl:apply-templates select="*[not(following-sibling::Header)]" />
    </MessageSummary>
  </xsl:template>
</xsl:stylesheet>

如果在&#34;随机名称&#34;中有其他名为Message的元素。您可能希望使此模板更具体,例如

  <xsl:template match="Messages/Message">

所以它只捕获你真正想要的元素。