замена xsd: выбор в регулярно обновляемых XSD - PullRequest
0 голосов
/ 21 ноября 2018

Существует ли простой (XSLT?), Предпочтительно автоматизированный, способ изменить конструкцию xsd: choice в файле XSD на определение без конструкции выбора.Например, я получаю XSD, который содержит следующий сегмент:

<xsd:choice minOccurs="1" maxOccurs="1">
   <xsd:element name="ExistingBuild" type="ExistingBuild" nillable="false"/>
   <xsd:element name="NewBuild" type="NewBuild" nillable="false"/>
</xsd:choice>

Этот XSD необходимо импортировать в приложение, которое не поддерживает конструкцию выбора.Я вручную изменил XSD, чтобы сегмент был определен следующим образом:

<xsd:element name="ExistingBuild" type="ExistingBuild" nillable="false" minOccurs="0" maxOccurs="1"/>
<xsd:element name="NewBuild" type="NewBuild" nillable="false" minOccurs="0" maxOccurs="1"/>

Полученный XSD может быть правильно импортирован и служит цели.Так что вручную я могу это изменить.

Тем не менее, этот XSD будет регулярно обновляться в будущем, и мне нужно будет вручную изменять его каждый раз при доставке новой версии.Чтобы избежать ошибок вручную, я хочу автоматизировать это преобразование.Является ли XSLT возможным решением для этого, и как бы я определил такое решение XSLT?

Заранее благодарен за любую помощь в этом.

1 Ответ

0 голосов
/ 21 ноября 2018

Не так сложно написать XSLT для удаления элемента xsd:choice

Начните с шаблона идентификации (который обрабатывает вещи, которые вы не хотите обновлять)

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

Добавьте шаблон, чтобы игнорировать xsd:choice

<xsl:template match="xsd:choice">
  <xsl:apply-templates />
</xsl:template>

Затем добавьте шаблон для обработки дочернего элемента xsd:elements

<xsl:template match="xsd:choice/xsd:element">
  <xsd:element minOccurs="0" maxOccurs="{../@maxOccurs}">
    <xsl:apply-templates select="@*" />
  </xsd:element>
</xsl:template>

Соединение всего этого вместе дает это ...

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xsd="https://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:choice">
    <xsl:apply-templates />
  </xsl:template>

  <xsl:template match="xsd:choice/xsd:element">
    <xsd:element minOccurs="0" maxOccurs="{../@maxOccurs}">
      <xsl:apply-templates select="@*" />
    </xsd:element>
  </xsl:template>
</xsl:stylesheet>

Смотрите его в действии с неполной схемой по адресу http://xsltfiddle.liberty -development.net / bFDb2Di

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