XSD с контролем версий для атрибута с поведением пропуска - PullRequest
1 голос
/ 31 января 2012

Я хочу иметь возможность контроля версий моего XML-файла.Я хочу, чтобы старый xsd-файл мог проверять новые версии полученного XML-файла.

Для этого я буду защищать неизвестный тег xml с помощью атрибутов версии.

Вопрос: как заставить xsd пропускать часть XML на основе атрибута версии?В приведенном ниже примере я хочу, чтобы xsd мог проверять любые теги с версиями 1 и 2, но не с 3.

Сценарий:

    <MYXML>
    <SOME_XML version="1">
        <SOME_VERSION_1_DATA>this_is_data_only_for_version_1</SOME_VERSION_1_DATA>
    </SOME_XML>
    <SOME_XML version="2">
        <SOME_VERSION_2_DATA>this_is_data_only_for_version_2</SOME_VERSION_2_DATA>
    </SOME_XML>
    <SOME_XML version="3">
        <SOME_VERSION_3_DATA>this_is_data_only_for_version_3</SOME_VERSION_3_DATA>
    </SOME_XML>
</MYXML>


<xs:complexType name="SOME_XML">
    <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="1" name="SOME_VERSION_1_DATA" type="xs:string"/>
        <xs:element minOccurs="0" maxOccurs="1" name="SOME_VERSION_2_DATA" type="xs:string"/>
   </xs:sequence>
   <xs:attribute ref="version"/>
 </xs:complexType>

 <xs:attribute name="version">
   <xs:simpleType>
    <xs:restriction base="xs:integer">
       <xs:enumeration value="1"/>
       <xs:enumeration value="2"/>
     </xs:restriction>
     <xs:anyAttribute processContents="skip"/>  <-- SKIP the attribute if NOT 1 ro 2?
   </xs:simpleType>
</xs:attribute>

Ответы [ 2 ]

1 голос
/ 31 января 2012

Я не уверен, как напрямую ответить на вашу проблему, использование пропуска определенных деталей из XML.
Если это возможно в вашей среде, я предлагаю xslt для преобразования исходного XML в версию3 файла будут пропущены, и проверены сгенерированные XLST выходные данные.

XSLT для копирования всего файла при отбрасывании узлов с @atribute version == 3

<xsl:template match="*">
    <xsl:if test="@version != '3'">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:if>
</xsl:template>
<xsl:template match="@*|text()|comment()|processing-instruction()">
    <xsl:copy-of select="."/>
</xsl:template>

note, XSLT записан как есть, этоне был проверен для данного ввода.

0 голосов
/ 31 января 2012

Я бы не использовал атрибуты для этого, поскольку атрибуты не могут «изменять» модели содержимого. Если вы думаете о том, чтобы сделать ваше приложение, обрабатывающее XML, «совместимым с прямым способом» (т.е. использовать старые XSD для нового контента), то я бы предпочел использовать обязательный элемент версии, за которым следует необязательный xsd: any - все смешивается с некоторыми правила оформления.

Короче говоря, вам понадобится установка такого типа, чтобы иметь возможность обрабатывать уникальное ограничение атрибуции частиц (или, другими словами, ограничение, которое парсер не может смотреть вперед, чтобы выяснить, "где" он находится в XSD).

Изначально вы даже можете начать без обязательного тега версии, просто добавьте дополнительный xsd: любой, где находится ваше место расширяемости. По мере того, как последующие версии улучшают содержимое, вам, возможно, придется добавить этот обязательный маркер версии (опять же, для работы с UPA), затем уточненное содержимое, а затем дополнительный необязательный xsd: any.

В общем, следует учитывать и другие вещи, такие как использование расширений / ограничений типов в вашем XSD и влияние, которое это может оказать на схемы прямой совместимости, такие как схема, которую я только что описал выше (пожалуйста, прочитайте это на SO ).

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