我想使用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来实现这个目标吗? 任何帮助将不胜感激。
感谢。
答案 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">
所以它只捕获你真正想要的元素。