Xslt превращает xsd в xsd: правило приоритета, чтобы избежать - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь использовать xslt для изменения схемы XML на другую. У меня просто проблемы с приоритетом в одном из моих изменений. Я хотел бы добавить в мою первую схему элемент в последовательности и добавить атрибут к элементам, которые уже существуют. Я также хочу добавить attributeGroup перед (конец тега complexType). Мне удается создать отдельно оба преобразования, но они не работают вместе из-за приоритета.

Вот добавление моей группы атрибутов:

  <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>

Когда я запускаю свое преобразование, я получаю только созданный atttsXrm (потому что 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>

Я не могу найти способ поместить оба преобразования в один и тот же шаблон с apply-templates, например. Надеюсь, кто-нибудь может мне помочь, С уважением.

1 Ответ

0 голосов
/ 05 июля 2018

Как уже упоминалось в комментариях, проблема в том, что вы используете 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>

Читайте о copy-of против apply-templates здесь: XSLT: в чем разница между и ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...