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>