我想使用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">
所以它只捕获你真正想要的元素