我正在尝试使用xslt将XML模式更改为另一个。 我只是优先考虑一些麻烦而已。 我想在序列中添加一个元素,并向已经存在的元素添加一个属性。我还想在(complexType标签的结尾)之前添加一个attributeGroup。 我成功地分别创建了两个转换,但是由于优先级,它不能一起工作。
这是我的attributeGroup的添加:
<xsl:template match="xsd:complexType">
<xsl:copy>
<xsl:copy-of select="*"/>
<xsl:element name="xsd:attributeGroup">
<xsl:attribute name="ref">attributsXrm</xsl:attribute>
</xsl:element>
</xsl:copy>
</xsl:template>
这是我的元素“ balisesXrm”的添加:
<xsl:template match="xsd:element">
<xsl:element name="xsd:element">
<xsl:attribute name="ref">balisesXrmType</xsl:attribute>
</xsl:element>
<xsl:copy>
<xsl:attribute name="maxOccurs">unbounded</xsl:attribute>
<xsl:apply-templates select="node()| @*[not(name() = 'maxOccurs')]" />
</xsl:copy>
</xsl:template>
启动转换时,我只会创建attributsXrm(因为即使在我的complexType的名称被删除的情况下,complexType也位于工作元素的前面,我也不知道为什么),如您在这里看到的:
<xsd:complexType>
<xsd:sequence>
<xsd:element name="refid" type="xsd:QName"/>
</xsd:sequence>
<xsd:attributeGroup ref="attributsXrm"/>
</xsd:complexType>
我想得到:
<xsd:complexType name="typeAssociation">
<xsd:sequence>
<xsd:element maxOccurs="unbounded" name="refid" type="xsd:QName"/>
<xsd:element ref="balisesXrm">
</xsd:sequence>
<xsd:attributeGroup ref="attributsXrm"/>
</xsd:complexType>
我让您看到输入的XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="urn:SBEGestionZonesAeriennesSYSCA-schema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="3.2.1ec" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="typeAssociation">
<xsd:sequence>
<xsd:element name="refid" type="xsd:QName"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
例如,我找不到一种将两个变换都放在同一模板中的方法。 希望有人可以帮助我, 问候。
答案 0 :(得分:1)
如评论中所述,问题在于您在与xsl:copy-of
匹配的模板中使用xsd:complexType
。 xsl:copy-of
指令仅复制所选节点,而无需任何进一步的转换。您需要使用xsl:apply-templates
来允许XSLT引擎继续处理并匹配所选元素的模板。
尝试使用此XSLT(我也简化了该操作,以删除对xsl:element
的使用)
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="xsd:complexType">
<xsl:copy>
<xsl:apply-templates />
<xsd:attributeGroup ref="attributsXrm" />
</xsl:copy>
</xsl:template>
<xsl:template match="xsd:element">
<xsd:element maxOccurs="unbounded">
<xsl:apply-templates select="node()| @*[not(name() = 'maxOccurs')]" />
</xsd:element>
<xsd:element ref="balisesXrmType"></xsd:element>
</xsl:template>
</xsl:stylesheet>
在XSLT: what is the difference between <copy-of> and <apply-templates>?
上阅读copy-of
与apply-templates