Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Docx or XPS(or ooxml in general) Relationship transform example

Well I already know that there is a document about this, which states:

12.2.4.26 Relationships Transform Algorithm
13 The relationships transform takes the XML document from the Relationships part and converts it to another
14 XML document.
15 The package implementer might create relationships XML that contains content from several namespaces, along
16 with versioning instructions as defined in Part 5: “Markup Compatibility and Extensibility”. [O6.11]
17 The relationships transform algorithm is as follows:
18 Step 1: Process versioning instructions
19 1. The package implementer shall process the versioning instructions, considering that the only known
20 namespace is the Relationships namespace.
21 2. The package implementer shall remove all ignorable content, ignoring preservation attributes.
22 3. The package implementer shall remove all versioning instructions.
23 Step 2: Sort and filter relationships
24 1. The package implementer shall remove all namespace declarations except the Relationships namespace
25 declaration.
26 2. The package implementer shall remove the Relationships namespace prefix, if it is present.
27 3. The package implementer shall sort relationship elements by Id value in lexicographical order,
28 considering Id values as case-sensitive Unicode strings.
29 4. The package implementer shall remove all Relationship elements that do not have eitheran Id value
30 that matches any SourceId valueor a Type value that matches any SourceType value, among the
31 SourceId and SourceType values specified in the transform definition. Producers and consumers shall
32 compare values as case-sensitive Unicode strings. [M6.27] The resulting XML document holds all
33 Relationship elements that either have an Id value that matches a SourceId value or a Type value that
34 matches a SourceType value specified in the transform definition.
35 Step 3: Prepare for canonicalization
Digital Signatures
58
1. The package implementer shall remove all characters between the 1 Relationships start tag and the first
2 Relationship start tag.
3 2. The package implementer shall remove any contents of the Relationship element.
4 3. The package implementer shall remove all characters between the last Relationship end tag and the
5 Relationships end tag.
6 4. If there are no Relationship elements, the package implementer shall remove all characters between
7 the Relationships start tag and the Relationships end tag.

But I'm a little confused in the process because in every try I reproduce incorrect transformation even though supposedly I have abided all specs in the doc,

maybe if there was only ONE example of such transformation(only input => output) I would be a lot less confused. So the only thing required here is the example of such pacakage specific xml function(or optionally, with an answer and codes though not required cause I have developed most of it.)

So here's the tag trying to produce the output:

<Reference URI="/Documents/1/Pages/_rels/1.fpage.rels?ContentType=application/vnd.openxmlformats-package.relationships+xml"><Transforms><Transform Algorithm="http://schemas.openxmlformats.org/package/2006/RelationshipTransform"><opc:RelationshipReference SourceId="rId1" /></Transform><Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /></Transforms></Reference>

And here's the original relationships file:

<?xml version="1.0" encoding="utf-8"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="/Documents/1/Pages/3.xml" Id="rId3" /><Relationship Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="/Documents/1/Pages/2.xml" Id="rId2" /><Relationship Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="/Documents/1/Pages/1.xml" Id="rId1"/></Relationships>

and here's the (incorrectly) transformed one:

<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Target="/Documents/1/Pages/1.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"></Relationship></Relationships>
like image 846
lkn2993 Avatar asked Feb 11 '16 17:02

lkn2993


1 Answers

I have answered this question here: XML Relationship Transform Algorithm

TL;DR You forgot the "Preparation to Canonicalization" step in Relationship Transformation and not adding the "TargetMode" attribute to the "Relationship" element.

like image 136
emplor Avatar answered Nov 18 '22 03:11

emplor