从某个节点开始的XSLT复制



我想使用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完成此任务?如有任何帮助,我将不胜感激。

谢谢。

因此,当您处于输入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>

如果你在"随机名称"部分有其他命名为Message的元素,你可能希望使这个模板更具体,例如

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

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

相关内容

  • 没有找到相关文章

最新更新