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>**
要求如下:
- 删除 Kid 元素的所有兄弟姐妹和 parent。
- 保留 Kid 元素的所有详细信息,包括属性和嵌套元素。
- 添加一个新的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>
我有一个包含大量数据的传入 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>**
要求如下:
- 删除 Kid 元素的所有兄弟姐妹和 parent。
- 保留 Kid 元素的所有详细信息,包括属性和嵌套元素。
- 添加一个新的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>