我有一个传入的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>**
要求如下:
- 删除child元素的所有兄弟元素和父元素。
- 保留子元素的所有细节,包括属性和嵌套元素。
如果有人能写一个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>