Я хотел бы открыть структуру набора данных XML, для которой я не вижу схемы XML. В рамках этого открытия я хотел бы вычислить минимальные и максимальные мощности (minOccurs
и maxOccurs
) элементов набора данных. Я пробовал различные инструменты для генерации XML-схем из документов XML, но они не генерируют minOccurs
и maxOccurs
. Тем не менее, я подозреваю, что это возможно с помощью XSLT (2.0+).XSLT для генерации мощностей элементов
Более конкретно, скажем, у меня есть следующий XML-документ:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<a/>
<b>
<c/>
</b>
<b/>
</root>
Я хотел бы быть в состоянии вычислить значения мощности в форме, как это:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<a minOccurs="1" maxOccurs="1"/>
<b minOccurs="2" maxOccurs="2">
<c minOccurs="0" maxOccurs="1"/>
</b>
</root>
Дети корня будет всегда имеют одинаковую максимальную и минимальную мощность, поэтому часть может быть вычислена примерно так:
<xsl:template match="/*">
<xsl:element name="{name()}">
<xsl:for-each-group select="*" group-by="name()">
<xsl:sort select="current-grouping-key()"/>
<xsl:element name="{current-grouping-key()}">
<xsl:variable name="cardinality" select="count(current-group())"/>
<xsl:attribute name="minOccurs" select="$cardinality"/>
<xsl:attribute name="maxOccurs" select="$cardinality"/>
</xsl:element>
</xsl:for-each-group>
</xsl:element>
</xsl:template>
Однако я не могу окунуться в голову, как продолжить мощь внуков. Я подозреваю, что это можно абстрагировать в рекурсивный xsl:function
.
Любые предложения о том, как действовать, приветствуются!
"* Дети из корня всегда имеют одинаковую максимальную и минимальную мощность *« Почему? –
Поскольку существует только один корневой элемент, его дочерние элементы будут иметь только одну мощность в одном документе XML. –
> Я пробовал различные инструменты для генерации XML-схем из XML-документов. <Вы пытались использовать Oxygen -> generate XML? [Docu Oxygen] (https://www.oxygenxml.com/doc/versions/18.0/ug-editor /topics/converting-between-schema-languages.html) – uL1