Я хотел бы узнать структуру набора данных XML, для которого у меня нет схемы XML. В рамках этого открытия я хотел бы вычислить минимальное и максимальное количество элементов (minOccurs
и maxOccurs
) элементов набора данных. Я пробовал различные инструменты для создания схем XML из документов XML, но они не генерируют minOccurs
и maxOccurs
. Однако я подозреваю, что это возможно с XSLT (2.0+).
Более конкретно, скажем, у меня есть следующий 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
.
Любые предложения о том, как действовать, приветствуются!
maxOccurs="unbounded"
вместо конкретного числа. Кроме того, я хотел бы иметь возможность расширить генерацию схемы для учета только непустых элементов. - person Jindřich Mynarz   schedule 21.09.2016