XSLT 转换:删除兄弟姐妹和 Parent,保留 XML 信息,添加新的 Parent 和兄弟姐妹

XSLT Transform: Remove siblings and Parent, Keep XML info, Add new Parent and Sibling

我有一个包含大量数据的传入 XML 文件。我想使用 XSLT 去除不需要的数据并添加新元素:

**<?xml version="1.0" encoding="UTF-8"?>
 <root>
  <child></child>
  <kid id="2">
    <name>abc</name>
    <age>15</age>
  </kid>
  <mykid></mykid>
 </root>**

我想将它转换成这个(删除了 parent 和同级并用新的 Parent 包装它):

 **<?xml version="1.0" encoding="UTF-8"?>
 <kids>
    <kid id="2">
        <name>abc</name>
        <age>15</age>
    </kid>
 </kids>**

要求如下:

  1. 删除 Kid 元素的所有兄弟姐妹和 parent。
  2. 保留 Kid 元素的所有详细信息,包括属性和嵌套元素。
  3. 添加一个新的parent.

如果有人能写出我可以用来转换我的 xml 的 XSLT 文件的框架,我将不胜感激?如果我遗漏了什么,请告诉我。还有一件事我想补充一下,我不知道parent或兄弟姐妹的细节要删除。我只知道感兴趣的元素和新 parent 和兄弟姐妹。

首先,阅读 XSLT Identity Transform,它可用于按原样复制现有元素和节点。

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

使用这意味着您可以直接满足要求 2,只需担心编写模板来满足要求 1 和 3。

如果你把需求 1 写成 "Remove all siblings of the kid element" 就更好了。然后,执行此操作的模板如下所示

<xsl:template match="*[kid]/*[not(self::kid)]" />

因此,*[kid] 匹配 kid 元素的父元素,然后 /*[not(self::kid)] 匹配子元素,kid 本身除外。模板是空的,所以元素被删除(或者更确切地说,它没有被复制到输出)。

需求 3 可以被视为 "Replace parent of kid element with kids"。执行此操作的模板如下:

<xsl:template match="*[kid]">
    <kids>
        <xsl:apply-templates select="@*|node()"/>
    </kids>
</xsl:template>

就是这样!试试这个 XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />

    <xsl:template match="*[kid]">
        <kids>
            <xsl:apply-templates select="@*|node()"/>
        </kids>
    </xsl:template>

    <xsl:template match="*[kid]/*[not(self::kid)]" />

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>