XSLT is designed for processing trees of XML nodes. While there are RDF serializations which are a "tree" of XML nodes (RDF/XML and RDF/XML-Abbrev), the underlying RDF data model is a graph.
If your resulting RDF graph is not also tree, you re going to have to do dirty things in your XSLT to traverse references and performance/maintainability/sanity can suffer. Just be aware of this if you modify the OWL format and then want to convert back to non-RDF XML.
A simple (tree) example is as follows:
## Foo has two types
@prefix e: <uri://example#>.
e:Foo a e:Bar.
e:Foo a e:Baz. # Second statement about e:Foo
For conversions back to non-RDF XML, if you use the most basic RDF/XML form you will get a list of RDF statements immediately under the top level rdf:RDF
element. Transforming these can involve searching the entire list of statements over and over.
<rdf:RDF xmlns:e="uri://example#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about="uri://example#Foo">
<rdf:type rdf:resource="uri://example#Baz"/>
</rdf:Description>
<rdf:Description rdf:about="uri://example#Foo">
<rdf:type rdf:resource="uri://example#Bar"/>
</rdf:Description>
</rdf:RDF>
You might find the RDF/XML-Abbrev format easier to read, but it is not easy to process with XSLT because RDF s data model is unordered and one graph can have many equivalent (but incompatible to your XSLT) XML forms. The example above can serialize as either of the following:
<!-- Bar is the containing element -->
<rdf:RDF xmlns:e="uri://example#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<e:Bar rdf:about="uri://example#Foo">
<rdf:type rdf:resource="uri://example#Baz"/>
</e:Bar>
</rdf:RDF>
<!-- Baz is the containing element -->
<rdf:RDF xmlns:e="uri://example#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<e:Baz rdf:about="uri://example#Foo">
<rdf:type rdf:resource="uri://example#Bar"/>
</e:Bar>
</rdf:RDF>
Pete Kirkham s suggestion of creating a canonical form for serialization will aide you in writing XSLTs. In most cases, given the exact same input, a RDF library will serialize the statements to the same format every time, but I would not depend on this in the long run as data in a RDF graph is unordered.