我正在寻找一种方法(如果有可能)使用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>