XSLT:更改节点类型
XSLT: change node type
我有一个应用程序将其数据存储为 xml-序列化 类。由于正在进行重构,内部集合被更改为类型安全。 IE。在它们是 object[] 类型之前,即使每个集合只存储特定类型的对象,现在它们是 MyType[].
例如,一个名为 Parameters 的集合被序列化:
<Parameters>
<anyType xsi:type="Parameter">
...
</anyType>
</Parameters>
成为:
<Parameters>
<Parameter>
...
</Parameter>
</Parameters>
我需要将旧 xml 文件转换为新格式。所以我需要转换所有匹配的节点
<anyType xsi:type="Parameter">
到 <Parameter>
等 10 或 20 个其他集合和类型。
谁能告诉我这是什么样的转变?
为此您只需要一个模板规则:
<xsl:template match="anyType">
<Parameter><xsl:apply-templates/></Parameter>
</xsl:template>
与复制其他所有内容不变的身份模板规则一起。
一个更详细的版本,它从 xsi:type 中检索新元素的名称,并且如果存在其他属性,也会复制它。现在您有了三种方法,您应该能够编译您的自定义版本:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- identity template -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="anyType[@xsi:type]">
<xsl:element name="{@xsi:type}">
<xsl:apply-templates select="node()|@*[not(name()='xsi:type')]" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我有一个应用程序将其数据存储为 xml-序列化 类。由于正在进行重构,内部集合被更改为类型安全。 IE。在它们是 object[] 类型之前,即使每个集合只存储特定类型的对象,现在它们是 MyType[].
例如,一个名为 Parameters 的集合被序列化:
<Parameters>
<anyType xsi:type="Parameter">
...
</anyType>
</Parameters>
成为:
<Parameters>
<Parameter>
...
</Parameter>
</Parameters>
我需要将旧 xml 文件转换为新格式。所以我需要转换所有匹配的节点
<anyType xsi:type="Parameter">
到 <Parameter>
等 10 或 20 个其他集合和类型。
谁能告诉我这是什么样的转变?
为此您只需要一个模板规则:
<xsl:template match="anyType">
<Parameter><xsl:apply-templates/></Parameter>
</xsl:template>
与复制其他所有内容不变的身份模板规则一起。
一个更详细的版本,它从 xsi:type 中检索新元素的名称,并且如果存在其他属性,也会复制它。现在您有了三种方法,您应该能够编译您的自定义版本:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- identity template -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="anyType[@xsi:type]">
<xsl:element name="{@xsi:type}">
<xsl:apply-templates select="node()|@*[not(name()='xsi:type')]" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>