Xslt将xsd转换为xsd:避免的优先级规则

时间:2018-07-05 10:39:18

标签: xml xslt xsd

我正在尝试使用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>

例如,我找不到一种将两个变换都放在同一模板中的方法。 希望有人可以帮助我, 问候。

1 个答案:

答案 0 :(得分:1)

如评论中所述,问题在于您在与xsl:copy-of匹配的模板中使用xsd:complexTypexsl: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-ofapply-templates