gpt4 book ai didi

xslt - 使用 XSLT 从 XML 架构中删除未使用的元素

转载 作者:行者123 更新时间:2023-12-02 11:45:01 25 4
gpt4 key购买 nike

我正在寻找一种方法(如果可能的话)使用 XSD 文档的 XSL 转换来删除未使用的元素。这在我的工作中经常出现,公司会定义一个 XSD,其中包含所有内容,但随后他们会想要为其中的单个根元素创建一个精简版本。

为了进一步解释,我可能有一个如下所示的 XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="RootElement">
<xs:complexType>
<xs:sequence>
<xs:element ref="ChildElement"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ChildElement"/>
<xs:element name="UnusedElement"/>
</xs:schema>

我希望能够做的是设置一个 XSL,在其中提供起始元素(在本例中为 RootElement),它将复制所有依赖元素,但忽略未使用的元素。在上面的示例中,如果我传入 RootElement,我希望看到包含 RootElementChildElement,但省略 UnusedElement

(当我说“提供起始元素”时,我很高兴打开样式表并在需要时输入 xsl:template match="RootElement"。)

这显然必须是递归的,因此将导航在起始元素下面定义的整个结构,并且该架构中未使用的任何元素都将被丢弃。

(当然,如果它可以在任何导入的模式中执行相同的操作,那就更好了!)

我在 Google 上进行了大量搜索,但找不到任何相关信息 - 我不确定这是否意味着这是不可能的。

谢谢!

编辑:实际上我可能应该澄清并说我想删除未使用的元素和类型,因此它将遵循 ref="childElement"type="someType" 链接。

最佳答案

这种转变:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" >
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:param name="ptopElementName" select="'RootElement'"/>

<xsl:variable name="vTop" select=
"/*/xs:element[@name=$ptopElementName]"/>

<xsl:variable name="vNames"
select="$vTop/descendant-or-self::*/@name"/>

<xsl:variable name="vRefs"
select="$vTop/descendant-or-self::*/@ref"/>

<xsl:variable name="vTypes"
select="$vTop/descendant-or-self::*/@type"/>

<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>

<xsl:template match="xs:element">
<xsl:if test=
"@name=$vNames
or
@name=$vRefs
or
ancestor-or-self::*[@name=$ptopElementName]">
<xsl:call-template name="identity"/>
</xsl:if>
</xsl:template>

<xsl:template match="xs:complexType|xs:simpleType">
<xsl:if test=
"@name=$vTypes
or
ancestor-or-self::*[@name=$ptopElementName]">
<xsl:call-template name="identity"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="RootElement">
<xs:complexType>
<xs:sequence>
<xs:element ref="ChildElement"/>
</xs:sequence>
</xs:complexType></xs:element>
<xs:element name="ChildElement"/>
<xs:element name="UnusedElement"/>
</xs:schema>

产生想要的、正确的结果:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="RootElement">
<xs:complexType>
<xs:sequence>
<xs:element ref="ChildElement"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="ChildElement"/>
</xs:schema>

关于xslt - 使用 XSLT 从 XML 架构中删除未使用的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5644617/

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