XSLT转换:删除兄弟和父节点,保留XML信息,添加新的父节点和兄弟节点



我有一个传入的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>**

我想把它变成这样(删除父元素和兄弟元素,用新父元素包装):

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

要求如下:

  1. 删除child元素的所有兄弟元素和父元素。
  2. 保留子元素的所有细节,包括属性和嵌套元素。

如果有人能写一个XSLT文件的框架,我可以用它来转换我的xml,我将非常感激。如果我错过了什么,请告诉我。还有一件事我想补充,我不知道父母或兄弟姐妹的细节要删除。我只知道兴趣元素和新的父母和兄弟姐妹。

首先,阅读XSLT标识转换,它可用于按原样复制现有元素和节点。

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

这样做意味着你可以直接满足需求2,而只需要担心编写模板来满足需求1和3。

如果您将需求1写成"删除kid元素的所有兄弟元素"会更好。然后,执行此操作的模板看起来像这样

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

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

需求3可以被看作是"用kids替换kid元素的父元素"。这样做的模板如下:

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

最新更新