如何使用XLST转换某些XML,以便当前根节点的第一个直接子节点成为新的根节点。
例如,给定以下XML:
<Envelope>
<Nodes>
<Node1>
<ChildNode>lorem</ChildNode>
<Node1>
<Node2>
<ChildNode>lorem</ChildNode>
<Node2>
</Nodes>
</Envelope>
应该成为:
<Nodes>
<Node1>
<ChildNode>lorem</ChildNode>
<Node1>
<Node2>
<ChildNode>lorem</ChildNode>
<Node2>
</Nodes>
谢谢!
答案 0 :(得分:1)
向身份转换添加规则,除了处理子文件外,不会为文档元素的结果树添加任何内容:
<?xml version="1.0" encoding="US-ASCII"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="/*">
<xsl:apply-templates select="*[1]"/>
</xsl:template>
<xsl:template match="@*|node()"><!--identity for all other nodes-->
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
(编辑为与文档元素的名称无关)
(再次编辑以仅保留文档元素的第一个子元素)
答案 1 :(得分:1)
您不需要做任何花哨的事情,只需匹配根(/*
)并将copy-of
作为第一个孩子(*[1]
)。
这种情况下,可以使用简单的内置命令来执行所需的操作,而不是使用身份转换。
<?xml version="1.0" encoding="US-ASCII"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="/*">
<xsl:copy-of select="*[1]"/>
</xsl:template>
</xsl:stylesheet>
编辑:根据G. Ken Holman和Sean B. Durkin的评论修正了根选择器。
答案 2 :(得分:1)
如果你想从消息中删除信封,那么有一种比XSLT更优雅的方式:你可以定义一个所谓的信封模式,让XML反汇编管道组件知道消息被打包在这种信封中。从这一点开始,一旦收到消息,信封将被自动删除。这很好,因为您不必开发,部署和维护地图。