gpt4 book ai didi

xml - 使用 xslt 转换多个 xml 模式文档

转载 作者:数据小太阳 更新时间:2023-10-29 02:14:13 36 4
gpt4 key购买 nike

我有许多 xml 架构文档,用于描述我的应用程序的配置设置。 xml 模式看起来类似于以下几行:

客户端.xsd

<xsd:schema targetNamespace="http://www.example.com/network"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:complexType name="Client">
<xsd:attribute name="Host" type="xsd:string>
</xsd:complexType>

</xsd:schema>

服务器.xsd

<xsd:schema targetNamespace="http://www.example.com/network"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:complexType name="Server">
<xsd:attribute name="Port" type="xsd:unsignedShort>
<xsd:attribute name="MaxConnections" type="xsd:int default="32">
</xsd:complexType>

</xsd:schema>

应用程序.xsd

<xsd:schema targetNamespace="http://www.example.com/core"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:complexType name="Application">
<xsd:attribute name="Name" type="xsd:string>
<xsd:attribute name="Id" type="xsd:int>
</xsd:complexType>

</xsd:schema>

FooClient.xsd

<xsd:schema targetNamespace="http://www.example.com/foo"
xmlns:core="network://www.example.com/network"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:import namespace="http://www.example.com/network"
schemaLocation="client.xsd"/>

<xsd:complexType name="FooClient">
<xsd:complexContent>
<xsd:extension base="network:Client">
<xsd:attribute name="foo" type="xsd:string"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>

</xsd:schema>

FooServer.xsd

<xsd:schema targetNamespace="http://www.example.com/foo"
xmlns:core="network://www.example.com/network"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:import namespace="http://www.example.com/network"
schemaLocation="client.xsd"/>

<xsd:complexType name="FooServer">
<xsd:complexContent>
<xsd:extension base="network:Server">
<xsd:attribute name="foo" type="xsd:string"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>

</xsd:schema>

FooApplication.xsd

<xsd:schema targetNamespace="http://www.example.com/foo"
xmlns:core="http://www.example.com/core"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:import namespace="http://www.example.com/core"
schemaLocation="Application.xsd"/>

<xsd:include schemaLocation="FooClient.xsd"/>
<xsd:include schemaLocation="FooServer.xsd"/>

<xsd:complexType name="FooApplication">
<xsd:complexContent>
<xsd:extension base="core:Application">
<xsd:sequence>
<xsd:element name="FooInput" type="FooClient"/>
<xsd:element name="FooOutput" type="FooServer"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>

<xsd:element name="Foo" type="FooApplication"/>

</xsd:schema>

这是实例文档的示例:

<foo:Foo xmlns:foo="http://www.example.com/foo" 
Id="1234"
Name="FooInstance1">

<FooInput Host="localhost:12345"
Name="Input"
foo="bar"/>

<FooOutput Port="54321"
Name="Output"
foo="bar"/>

</foo:Foo>

我的目标是获取 FooApplication 模式文档并将其转换为人类可读的形式,以便负责维护应用程序的人员确切地知道可用的配置选项、数据类型、默认值等。最终我将添加文档也可以添加到输出中的元素,但现在我尽量保持简单。所以上面的例子看起来像这样:

FooApplication/Id, int
FooApplication/Name, string
FooApplication/FooInput/Host, string
FooApplication/FooInput/foo, string
FooApplication/FooOutput/Port, unsignedShort
FooApplication/FooOutput/MaxConnections, int, default=32
FooApplication/FooOutput/foo, string

对于此任务,xslt 似乎是显而易见的工具。但是,我很难理解如何从多个文档中提取数据。我试过这样的事情(例如索引 complexType 的所有元素):

<xsl:template match="xsd:include">
<xsl:apply-templates select="document(@schemaLocation)"/>
</xsl:template>

<xsl:template match="xsd:import">
<xsl:apply-templates select="document(@schemaLocation)"/>
</xsl:template>

<xsl:key name="complexType" match="xsd:complexType" use="@name"/>

然而,当使用 key 时,只有来自 FooApplicaiton.xsd 的 complexType 被解析。

有没有人对如何实现这一目标有任何见解?

非常感谢。

最佳答案

我会先看看 DocFlex看看他们处理 XML Schema 文档的方法对您是否有意义。然后您应该能够按比例放大或缩小。对于任何重要的事情,如果您必须构建自己的文档系统,我认为它应该基于 XML 模式对象模型 API (XSOM),创建 XML 然后可以使用 XSLT 呈现...

关于xml - 使用 xslt 转换多个 xml 模式文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8369677/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com