[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

[xsl] Deleted selected nodes from XSD - howto for Newbie needed


Subject: [xsl] Deleted selected nodes from XSD - howto for Newbie needed
From: "Michael Lindenau" <michael.lindenau@xxxxxxxxxxxxxxxxxxxxxx>
Date: Thu, 14 Apr 2005 19:18:32 +0200 (CEST)

Hello everyone

I want to delete some unwanted nodes in an XML schema file. Unluckily I'm
only able to copy the whole structure. Whenever I access a specified node to
copy, I get the the text content but not the structure of the node. I think
it is just the right select-expression, that I'm not able to find.

The nodes I want to preserve contain named and unnamed complex types &
simple types and references which should be still in the resulting XSD. The
not needed complex types and referenced elements that were part of the nodes
that are to be deleted shouldn't be in the resulting XSD. Imports, includes
and namespaces are not to be considered.

Above you'll find some example.

Kind regards & thanks in advance

Michael Lindenau
Lvsungen+Ideen

Alejandro Puskin No 1, Portal H, 5C
29011 Malaga
Spanien

phone +49 179  29 28 834
mailto:michael.lindenau@xxxxxxxxxxxxxxxxxxxxxx

"It never hurts to multiply by zero -- it simplifies things a lot." Richard
Keeler

Simplified:

/Root/AllNodes/Header
/Root/AllNodes/Header/Detail
/Root/AllNodes/Nodes/NodeToBeKept1/..
/Root/AllNodes/Nodes/NodeToBeKept2/..
/Root/AllNodes/Nodes/NodeToBeDeleted1/..
/Root/AllNodes/Nodes/NodeToBeDeleted2/..

should result in

/Root/AllNodes/Header
/Root/AllNodes/Header/Detail
/Root/AllNodes/Nodes/NodeToBeKept1/..
/Root/AllNodes/Nodes/NodeToBeKept2/..


Here is the excerpt from my XSLT that doesn't work:
..
<xsl:template
match="/xs:schema/xs:complexType/xs:choice/xs:element/@name['NodeToBeKept1']">   <xsl:copy>
    <xsl:apply-templates select="*|@*" />
   </xsl:copy>
</xsl:template>
..

Here is the complete example schema

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
	<xs:element name="Root" type="RootType"/>
	<xs:complexType name="RootType">
		<xs:sequence>
			<xs:element name="AllNodes" type="AllNodesType"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="HeaderDetailType">
		<xs:sequence>
			<xs:element name="Detail1" type="Detail1Type" minOccurs="0"/>
			<xs:element ref="Detail2" minOccurs="0"/>
			<xs:element ref="Detail3" minOccurs="0"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="AllNodesType">
		<xs:sequence>
			<xs:element ref="Header1"/>
			<xs:element ref="Header2"/>
			<xs:element name="Header3" type="NotEmptyString" minOccurs="0"/>
			<xs:element name="Header4" type="HeaderDetailType"/>
			<xs:choice>
				<xs:element name="Nodes" type="NodesType"/>
				<xs:element name="Others" type="OthersType"/>
			</xs:choice>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="NodesType">
		<xs:choice>
			<xs:element name="NodeToBeKept1" type="NodeToBeKept1Type"/>
			<xs:element name="NodeToBeKept2" type="NodeToBeKept1Type"/>
			<xs:element name="NodeToBeDeleted1" type="NodeToBeDeleted1Type"/>
			<xs:element name="NodeToBeDeleted2" type="NodeToBeDeleted2Type"/>
		</xs:choice>
	</xs:complexType>
	<xs:complexType name="Detail1Type">
		<xs:sequence>
			<xs:element ref="DetailElement1"/>
			<xs:element ref="DetailElement2"/>
			<xs:element name="DetailElement3">
				<xs:simpleType>
					<xs:restriction base="xs:integer">
						<xs:minInclusive value="0"/>
						<xs:maxInclusive value="999"/>
					</xs:restriction>
				</xs:simpleType>
			</xs:element>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="NodeToBeKept1Type">
		<xs:sequence>
			<xs:element ref="Node1Element1"/>
			<xs:element ref="Node1Element2"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="NodeToBeKept2Type">
		<xs:sequence>
			<xs:element ref="Node2Element1"/>
			<xs:element ref="Node2Element2"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="NodeToBeDeleted1Type">
		<xs:sequence>
			<xs:element ref="Node3Element1"/>
			<xs:element ref="Node3Element2"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="NodeToBeDeleted2Type">
		<xs:sequence>
			<xs:element ref="Node4Element1"/>
			<xs:element ref="Node4Element2"/>
		</xs:sequence>
	</xs:complexType>
	<xs:element name="Detail2" type="xs:boolean"/>
	<xs:element name="Detail3" type="NotEmptyString"/>
	<xs:element name="DetailElement1" type="NotEmptyString"/>
	<xs:element name="DetailElement2" type="NotEmptyString"/>
	<xs:element name="Header1" type="NotEmptyString"/>
	<xs:element name="Header2" type="NotEmptyString"/>
	<xs:element name="Node1Element1">
		<xs:simpleType>
			<xs:restriction base="xs:integer">
				<xs:minInclusive value="0"/>
				<xs:maxInclusive value="999"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="Node1Element2" type="NotEmptyString"/>
	<xs:element name="Node2Element1" type="NotEmptyString"/>
	<xs:element name="Node2Element2" type="NotEmptyString"/>
	<xs:element name="Node3Element1" type="NotEmptyString"/>
	<xs:element name="Node3Element2" type="NotEmptyString"/>
	<xs:element name="Node4Element1" type="NotEmptyString"/>
	<xs:element name="Node4Element2" type="NotEmptyString"/>
	<xs:simpleType name="NotEmptyString">
		<xs:restriction base="xs:string">
			<xs:minLength value="1"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:complexType name="OthersType">
		<xs:sequence>
			<xs:element name="Test"/>
			<xs:element name="Test2"/>
		</xs:sequence>
	</xs:complexType>
</xs:schema>

And here how it should look like after:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
	<xs:element name="Root" type="RootType"/>
	<xs:complexType name="RootType">
		<xs:sequence>
			<xs:element name="AllNodes" type="AllNodesType"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="HeaderDetailType">
		<xs:sequence>
			<xs:element name="Detail1" type="Detail1Type" minOccurs="0"/>
			<xs:element ref="Detail2" minOccurs="0"/>
			<xs:element ref="Detail3" minOccurs="0"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="AllNodesType">
		<xs:sequence>
			<xs:element ref="Header1"/>
			<xs:element ref="Header2"/>
			<xs:element name="Header3" type="NotEmptyString" minOccurs="0"/>
			<xs:element name="Header4" type="HeaderDetailType"/>
			<xs:choice>
				<xs:element name="Nodes" type="NodesType"/>
				<xs:element name="Others" type="OthersType"/>
			</xs:choice>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="NodesType">
		<xs:choice>
			<xs:element name="NodeToBeKept1" type="NodeToBeKept1Type"/>
			<xs:element name="NodeToBeKept2" type="NodeToBeKept1Type"/>
		</xs:choice>
	</xs:complexType>
	<xs:complexType name="Detail1Type">
		<xs:sequence>
			<xs:element ref="DetailElement1"/>
			<xs:element ref="DetailElement2"/>
			<xs:element name="DetailElement3">
				<xs:simpleType>
					<xs:restriction base="xs:integer">
						<xs:minInclusive value="0"/>
						<xs:maxInclusive value="999"/>
					</xs:restriction>
				</xs:simpleType>
			</xs:element>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="NodeToBeKept1Type">
		<xs:sequence>
			<xs:element ref="Node1Element1"/>
			<xs:element ref="Node1Element2"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="NodeToBeKept2Type">
		<xs:sequence>
			<xs:element ref="Node2Element1"/>
			<xs:element ref="Node2Element2"/>
		</xs:sequence>
	</xs:complexType>
	<xs:element name="Detail2" type="xs:boolean"/>
	<xs:element name="Detail3" type="NotEmptyString"/>
	<xs:element name="DetailElement1" type="NotEmptyString"/>
	<xs:element name="DetailElement2" type="NotEmptyString"/>
	<xs:element name="Header1" type="NotEmptyString"/>
	<xs:element name="Header2" type="NotEmptyString"/>
	<xs:element name="Node1Element1">
		<xs:simpleType>
			<xs:restriction base="xs:integer">
				<xs:minInclusive value="0"/>
				<xs:maxInclusive value="999"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="Node1Element2" type="NotEmptyString"/>
	<xs:element name="Node2Element1" type="NotEmptyString"/>
	<xs:element name="Node2Element2" type="NotEmptyString"/>
	<xs:simpleType name="NotEmptyString">
		<xs:restriction base="xs:string">
			<xs:minLength value="1"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:complexType name="OthersType">
		<xs:sequence>
			<xs:element name="Test"/>
			<xs:element name="Test2"/>
		</xs:sequence>
	</xs:complexType>
</xs:schema>


Current Thread