使用XSLT从XML模式中删除未使用的元素
发布时间:2020-12-16 07:52:05 所属栏目:百科 来源:网络整理
导读:我正在寻找一种方法(如果有可能)使用XSD文档的XSL转换来删除未使用的元素.这在我的工作中出现了很多,公司将在其中定义一个绝对的一切XSD,但是他们将要为其中的一个根元素创建一个削减版本. 为了进一步解释,我可能会有如下XSD: ?xml version="1.0" encoding=
我正在寻找一种方法(如果有可能)使用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中传入,我希望看到包含RootElement和ChildElement,但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> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |