在定期更新的 XSD 中替换 XSD:选择



是否有一种简单的(XSLT?(方法,最好是自动化的,可以将xsd文件中的xsd:choice构造更改为没有choice构造的定义。例如,我得到一个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需要在不支持choice构造的应用程序中导入。我已经手动更改了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解决方案?

提前感谢您在这方面的帮助。

编写一个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>

使用imcomplete架构查看它的实际操作http://xsltfiddle.liberty-development.net/bFDb2Di

最新更新