我想发现一个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模式的各种工具<您尝试过了“氧气 - >生成XML吗?[Docu Oxygen](https://www.oxygenxml.com/doc/versions/18.0/ug-editor /topics/converting-between-schema-languages.html) – uL1