使用 XSLT 将一个 xsd:复杂类型元素复制到另一个 xsd:复杂类型元素



我有以下输入.xsd结构:

<xs:element name="branches" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="branch" type="branch" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="branch">
<xs:element name="container" type="cNameAndVersion" minOccurs="0"/>
<xs:element name="branchMapping" minOccurs="0">
</xs:complexType>
<xs:complexType name="cNameAndVersion">
<xs:sequence/>
<xs:attribute name="name" type="xs:string"/>
<xs:attribute name="version" type="xs:long" use="required"/>
</xs:complexType>

在我的新文件中,分支应该包含容器级映射的列表(而不是只有一个容器(,但包含复制了以前容器的名称和版本。它看起来像这样:

<xs:complexType name="branch">
<xs:sequence>
<xs:complexType name="containerLeveMappings">
<xs:sequence>
<xs:element name="containerLevelMapping" type="containerLevelMappingEntry" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:sequence>
<xs:element name="branchMapping" minOccurs="0">
</xs:complexType>
<xs:complexType name=" containerLevelMappingEntry ">
<xs:sequence>
<xs:element name="container" type=" cNameAndVersion " minOccurs="0"/>
<xs:element name="levels" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="level" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>

据我了解,我在这里有 3 件事要做:

  1. 将新元素"containerLevelMappings"添加到分支
  2. 将值从旧分支/容器复制到分支/容器的新条目级别映射/条目(容器,级别(
  3. 从文件中删除分支/容器

我对 2. 有问题(。我不知道如何遍历所有分支并将其容器复制到新的容器级别映射。 我现在在 XSLT 文件中做了什么:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy copy-namespaces="no">
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="/root/branches/branch/branchMapping">
<xsl:element name="containerLeveMappings">
<xsl:element name="containerLeveMapping">
<xsl:element name="container">
<xsl:attribute name="version">
<xsl:value-of select = "../container/version" />
</xsl:attribute>
<xsl:attribute name="name">
<xsl:value-of select="../container/name"/>
</xsl:attribute>
</xsl:element>
<xsl:element name="levels"/>
</xsl:element>
</xsl:element>
<xsl:copy copy-namespaces="no">
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>

<xsl:template match="/root/branches/branch/container"/>
</xsl:stylesheet>
不幸的是,">

版本"和"名称"都是空字符串,同时取消编组新的 xml 文件。

换句话说,我想转换 xml 的这一部分:

<branches>
<branch>
<container name="name_1" version="2"/>
<branchMapping/>
</branch>
<branch>
<container name="name_2" version="3"/>
<branchMapping/>
</branch>
</branches>

到此表格:

<branches>
<branch>
<containerLevelMappings>
<containerLevelMapping>
<container name="name_1" version="2"/>
<level/>
</containerLevelMapping>
</containerLevelMappings>
<branchMapping/>
</branch>
<branch>
<containerLevelMappings>
<containerLevelMapping>
<container name="name_2" version="3"/>
<levels/>
</containerLevelMapping>
</containerLevelMappings>
<branchMapping/>
</branch>
</branches>

也许有人可以告诉我我的错误在哪里? 提前感谢!

nameversion是属性,因此需要@name@version

您的代码可以简化为:

<xsl:template match="/root/branches/branch/branchMapping">
<containerLevelMappings>
<containerLevelMapping>
<container version="{../container/@version}" 
name="{../container/@name}"/>
<levels/>
</containerLevelMapping >
</containerLevelMappings>
<xsl:copy copy-namespaces="no">
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>

我还纠正了元素名称中的几个拼写错误 - 如果您使用更简洁的语法,它们会更清晰地突出。

最新更新