1

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

谢谢!

4

3 回答 3

2

向身份转换添加一个规则,除了处理其子元素之外,不会向文档元素的结果树添加任何内容:

<?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>

(编辑为与文档元素的名称无关)

(再次编辑以仅保留文档元素的第一个子元素)

于 2013-09-09T23:20:15.313 回答
2

您不需要做任何花哨的事情,只需匹配根 ( /*) 并创建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 的评论更正了根选择器。

于 2013-09-09T23:23:44.500 回答
1

如果您想从消息中删除信封,有一种比 XSLT 更优雅的方法:您可以定义一个所谓的信封模式并让 XML 反汇编器管道组件知道消息被打包在这种信封中。从此时起,一旦收到消息,信封将被自动移除。这很好,因为您不必开发、部署和维护地图。

于 2013-09-10T19:19:48.433 回答