如何删除根节点并使第一个子节点成为XSLT的新根节点?

时间:2013-09-09 22:44:23

标签: xml xslt biztalk

如何使用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>

谢谢!

3 个答案:

答案 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反汇编管道组件知道消息被打包在这种信封中。从这一点开始,一旦收到消息,信封将被自动删除。这很好,因为您不必开发,部署和维护地图。