<div dir="ltr">John,<div><br></div><div><br></div><div>Thanks for contacting the original developers.  I now have </div><div>better understanding of the design.  In particular, I now </div><div>understand that OPC part references are nothing but </div>
<div>relative references and also understand why queries or </div><div>fragment identifiers were not used for referencing OPC </div><div>parts.</div><div><br></div><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
[Design Rationale]<br>
Several interesting requirements that drove the design of the pack URI scheme:<br>
<br>
1)      If a resource embedded with an OPC package is of a pre-existing MIME type that itself embeds relative references, then a MIME-type handler associated with that MIME type could use ordinary text-based relative-reference resolution mechanisms to resolve relative-references into URIs addressing other resources embedded within the same OPC package.<br>
</blockquote><div><br></div><div>I  spent a lot of time on this para.  Here </div><div>is my understanding of his intention:</div><div><br></div><div>  The base URI for an OPC part reference within </div><div>  an OPC part shall  be a pack URI, which is composed from the URI </div>
<div>  of the OPC package and the part name of the OPC part.</div><div><br></div><div>This is implied by the second paragraph in Clause 9.2.1 </div><div>of 29500-2:2012.</div><div><br></div><div><div>  Relative references from a part are interpreted relative </div>
<div>  to the base URI of that part. By default, the base URI of a </div><div>  part is derived from the name of the part, as defined in $B!x(BB.3. </div></div><div><br></div><div>This is also implied by the last bullet in A.3, namely:<br>
</div><div><br></div><div>  Resolve the relative reference against the base URI of the </div><div>  part holding the Unicode string, as it is defined in $B!x(B5.2 of </div><div>  RFC 3986. The path component of the resulting absolute </div>
<div>  URI is the part name</div><div><br></div><div>Let us review how base URIs are determined in </div><div>RFCs 3986 and 3987. </div><div><br></div><div>First, determination of base URIs can be MIME-type dependent.  </div>
<div>5.1.1 of RFC 3986 (<a href="http://tools.ietf.org/html/rfc3986#section-5.1.1">http://tools.ietf.org/html/rfc3986#section-5.1.1</a>)</div><div><div>allows base URIs to be embedded in an MIME-type dependent </div><div>
manner. </div><div><br></div><div>Second, specifying base URIs at the OPC package level is </div><div>allowed by 5.1.2 (<a href="http://tools.ietf.org/html/rfc3986#section-5.1.2">http://tools.ietf.org/html/rfc3986#section-5.1.2</a>).</div>
<div>That's why OPC can specify that pack URIs are base URIs.</div><div>(We should explicitly mention 5.1.2)</div><div><br></div><div>In the case of relationship parts, it is guaranteed that </div><div>base URIs are pack URIs.  This is because the use </div>
<div>of xml:base for relationship parts is prohibited by the </div><div>sentence immediately preceding to 9.3.2.2 in </div><div>29500-2:2012, which is:</div><div>  The xml:base attribute shall not be used to specify a </div>
<div>  base URI for relationship XML content.</div><div><br></div></div><div><br></div><div>Perhaps, almost everything (except the last </div><div>bullet in A.3) in Annex A is a restatement of </div><div>the resolution algorithm in RFC 3986 and </div>
<div>RFC 3987.  A.1 and A.2 in 29500-2:2012 </div><div>are such restatements.  I believe that A.3 is </div><div>questionable, because it deviates from </div><div>the generic algorithm in these RFCs and also </div><div>because it is not implemented by MS Office.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
2)      Allow for the deep-references from outside of a package to an individual embedded resource inside the package, while still supporting MIME-type-specific fragment identifiers to identify subobjects within the addressed resource.<br>
</blockquote><div><br></div><div>So, fragment identifiers of HTML should be usable for </div><div>locating fragments of HTML documents within OPC packages.  </div><div>Thus, we should not use fragment identifiers for referencing </div>
<div>OPC parts.  We have to provide something as part of URIs </div><div>for referencing OPC parts.  Makes sense.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

3)      Pack-scheme-aware client code could address and efficiently retrieve (via HTTP 1.1 byte-range requests) embedded resources from a package residing on a web-server without having any pack-scheme-aware or OPC-aware code running on the server.  (I don’t recall which, if any, of the multiple OPC implementations across Microsoft might have actually realized this design goal.)<br>
</blockquote><div><br></div><div>This deserves to be explicitly specified as part of 29500-2.</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<br>
The second requirement implied that a fragment identifier couldn’t be used to target an embedded resources, because there is no MIME-type independent standard for composing  fragment identifiers (in this case, what would have been composing the fragment identifier identifying an embedded resource together with the fragment identifier identifying some sub-element within that resource).<br>
</blockquote><div><br></div><div>Yes.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
The first requirement implied that query parameters could not be used to address individual embedded resources, because any such mechanism for using query parameter to specify “paths” to individual embedded resources wouldn’t relate in any way to ordinary relative references.<br>

<br></blockquote><div><br></div><div>I agree that query parameters cannot be used for addressing OPC </div><div>parts, if we want to use existing fragment identifiers for OPC parts</div><div>(MIME entities) within OPC packages.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
I sometime think of an OPC package as web-server-in-a-box.  </blockquote><div><br></div><div>Incidentally, I have thought something very similar for </div><div>EPUB packages, which are going to have content-</div><div>negotiation-in-a-box. </div>
<div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">The authority component of a the URI identifies a self-contained domain.  </blockquote>
<div><br></div><div>True.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">And composing an authority-free relative reference with an absolute URI reference to an embedded resource can never escape the confines of the containing package, just as </blockquote>
<div><br></div><div>What I suggested is different.   But I won't go into the details.</div><div>I would like to honor the original design motivation and improve </div><div>the text.  I see a *lot* of rooms for improvements.</div>
<div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">composing an authority-free relative reference with an absolute URI reference to web-server-hosted resource can never escape the confines of that web-server .  And, contained within the package is sufficient information to report the mime-type of every embedded resource, just as is typical of an HTTP server.<br>

<br>
If one has a web-site of resources that reference each other only via relative references, then those resources can be zipped up into an OPC package without tampering with any of those relative references. (Although one would have to explicitly capture the MIME-types of the embedded resources as they would be reported by the original HTTP server.)<br>

<br></blockquote><div><br></div><div>I doubt this, since relative references within a relationship part are resolved </div><div>with respect to the source part rather than the relationship part.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<br>
[Resolving Relative References]<br>
IMO the benefit of having pack uri defined in the OPC is to leverage (and to be compliant with) the Reference Resolution spec, which is much more complicated than just prepending the source part name. If we do not define the base URI for the part as pack://<authority>/<part name>, we’ll have to specify the resolution algorithm in the standard. Now we just say in A.3 -<br>
</blockquote><div><br></div><div>I think that using pack URIs from both inside and outside is </div><div>a bigger advantage.  I still doubt A.3, since it deviates from </div><div>the resolution algorithm in the two RFCs.</div>
<div><br></div><div>Regards,</div><div>Makoto</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<br>
10.   Resolve the relative reference against the base URI of the part holding the Unicode string, as it is defined in $B!x(B5.2 of RFC 3986. The path component of the resulting absolute URI is the part name.<br>
<br>
Also the schema give us the standard place to define case-insensitive path (and part name).<br>
<div class=""><br>
<br>
-----Original Message-----<br>
From: <a href="mailto:eb2mmrt@gmail.com">eb2mmrt@gmail.com</a> [mailto:<a href="mailto:eb2mmrt@gmail.com">eb2mmrt@gmail.com</a>] On Behalf Of MURATA Makoto<br>
</div><div><div class="h5">Sent: Wednesday, January 8, 2014 10:56 PM<br>
To: SC34<br>
Subject: Re: OPC part names and referenes<br>
<br>
John,<br>
<br>
<br>
>> 2) Resolution of relative URI references<br>
> I'm not sure I completely understand this.  Are you proposing to eliminate using pack URIs to resolve a relative reference (either an absolute-path reference or a relative-path reference) that is the value of a Target attribute of a Relationship element?<br>

<br>
Right.  To resolve relative-path references, we only have to prepend the source part name.  I'm not saying that the pack scheme should not be used anywhere.  I'm just saying that it should not be used for resolving absolute-path or relative-path references.<br>

<br>
>> Neither OPC part references (or Unicode strings as specified in Annex A) nor OPC part names contain schemes (e.g., http:).<br>
> If by "OPC part reference" you mean a pack URI, technically it does have a scheme - "pack".  The address of the external package, a part inside of which is being referenced, that is being referenced by the relationship contains a scheme, but that address' scheme+authority+path is munged into a string that can be stored as the pack URI's authority component.<br>

<br>
I mean "Unicode string" in Annex A by  "OPC part reference".<br>
They do not contain schemes, as demonstrated by A.5.<br>
<br>
><br>
>> 3) xml:base<br>
> I think it's already been implemented and is used by XAML or .Net.<br>
<br>
I am skeptical.  How can we resolve an relative-path OPC part reference if xml:base="<a href="http://www.example.com/foo.html" target="_blank">http://www.example.com/foo.html</a>"?  We have to guarantee that the base is an OPC part within the current OPC package.<br>

<br>
>> I think that we should limit our concern to MS Office.  The .Net implementation of OPC does not implement Annex A of Part 2 at all.<br>
> Channeling Chris here, I'd want to be careful we don't change something and omit looking at a known implementation on an assumption it won't be affected, even though your testing seems to indicate that.  If we come up with a short list of what appear to be implementation limitations (i.e., implementing a subset of what OPC allows), Chris/Jim/I can try to hunt down confirmations from the relevant product teams to confirm them and see if our final proposed changes to OPC would create incompatibilities.<br>

<br>
I agree that we should not forget .Net.  But I also think that .Net is already very non-conformant, since it does not support Annex A.<br>
<br>
Regards,<br>
Makoto<br>
<br>
><br>
> Re: Chris' e-mail:<br>
>> I have a feeling that some of the sticking points we discovered with<br>
>> regard to relative references were related to XPS<br>
> I think that was to do with XPS or Office always generating relationship targets with a "/" and the other without.  With our better understanding of relative references (relative-path reference vs. absolute-path reference), we found that both were correct and evaluate as expected.<br>

><br>
> John<br>
><br>
> -----Original Message-----<br>
> From: Chris Rae [mailto:<a href="mailto:Chris.Rae@microsoft.com">Chris.Rae@microsoft.com</a>]<br>
> Sent: Tuesday, January 7, 2014 10:14 AM<br>
> To: MURATA Makoto; SC34<br>
> Subject: RE: OPC part names and referenes<br>
><br>
> I have a feeling that some of the sticking points we discovered with regard to relative references were related to XPS, but I can't remember exactly what the details were. I'll do some investigation.<br>
><br>
> We'll have to tread somewhat carefully here, as OPC is the most widely implemented part of ISO/IEC 29500.<br>
><br>
> Chris<br>
><br>
> -----Original Message-----<br>
> From: <a href="mailto:eb2mmrt@gmail.com">eb2mmrt@gmail.com</a> [mailto:<a href="mailto:eb2mmrt@gmail.com">eb2mmrt@gmail.com</a>] On Behalf Of MURATA<br>
> Makoto<br>
> Sent: Monday, January 6, 2014 6:41 PM<br>
> To: SC34<br>
> Subject: Re: OPC part names and referenes<br>
><br>
> Here are some further experiments.<br>
><br>
> Summary:<br>
><br>
> MS Word 2007 does not allow non-ASCII characters within part names even if they are percent-encoded.  %HH in OPC part references are decoded as long as they represent ASCII characters.<br>
><br>
> Experiments:<br>
><br>
> First, I replaced "document.xml" in a WML document by "%E3%81%82.xml".<br>
> Specificaly:<br>
><br>
> - Renamed the file "document.xml" under the directory "word" as "%E3%81%82.xml"<br>
><br>
> - Renamed the file "document.xml.rels" under the directory "word/_rels" as "%E3%81%82.xml.rels"<br>
><br>
> - Replaced "word/document.xml" in the file "_rels/.rels" by "word/%E3%81%82.xml"<br>
><br>
> - Replaced "/word/document.xml" in "[Content_Types].xml" by "/word/%E3%81%82.xml"<br>
><br>
> Then, MS Word 2007 cannot open the revised WML document.<br>
><br>
> Second, I used "a" instead of "%E3%81%82" in the above four changes.<br>
> Then, the document opened successfully.<br>
><br>
> Third, I replaced "a.xml" in the file "_rels/.rels" by "%61.xml".  I also percent-encoded some other references (values of Relationship/@Target).<br>
> Then, the document opened successfully.<br>
><br>
> Fourth, just in case, I tried verbatim U+3042 (HIRAGANA LETTER A) rather than %E3%81%82.  As expected, the document does not open.<br>
><br>
> My conclusions:<br>
><br>
> - Non-ASCII characters in part names are not allowed even if they are percent-encoded.<br>
><br>
> - %HH in values of Relationship/@Target are decoded as long as they represent ASCII characters.<br>
><br>
> Regards,<br>
> Makoto<br>
><br>
> -----Original Message-----<br>
> From: <a href="mailto:eb2mmrt@gmail.com">eb2mmrt@gmail.com</a> [mailto:<a href="mailto:eb2mmrt@gmail.com">eb2mmrt@gmail.com</a>] On Behalf Of MURATA<br>
> Makoto<br>
> Sent: 06 January 2014 17:20<br>
> To: SC34<br>
> Subject: Re: OPC part names and referenes<br>
><br>
> I did some more experiments using MS Office 2007 and .Net.<br>
><br>
> Here is my understanding.<br>
><br>
> - MS Office 2007 converts %HH to characters at least when %HH represents ASCII characters.<br>
><br>
> - MS Office 2007 resolves absolute-path references (which begins with "/") correctly.<br>
><br>
> - MS Office 2007 resolves relative-path references (which does not begin with "/") correctly.<br>
><br>
> - .Net (Package.GetPart) recognizes neither relative-path references<br>
> nor %HH<br>
><br>
> I think that we should limit our concern to MS Office.  The .Net implementation of OPC does not implement Annex A of Part 2 at all.<br>
><br>
> Regards,<br>
> Makoto<br>
><br>
> 2013/12/28 MURATA Makoto <<a href="mailto:eb2m-mrt@asahi-net.or.jp">eb2m-mrt@asahi-net.or.jp</a>>:<br>
>> The more I think about OPC, the more confused I am.<br>
>><br>
>> I have thought that references to OPC parts ("Unicode string"<br>
>> in Annex A of OPC) can contain non-ASCII characaters and that such<br>
>> non-ASCII characters are percent-encoded before referenced OPC parts<br>
>> are located.  I have also thought that references to OPC parts are<br>
>> resolved relative to containing OPC parts when they do not begin with<br>
>> "/".<br>
>><br>
>> However, my experiment with .Net in F# appears to show I am mistaken.<br>
>> It reports errors if references to OPC parts contain non-ASCII<br>
>> characters.  Ir also reports errors if references to OPC parts do not<br>
>> begin with "/".<br>
>><br>
>> I plan to manually edit OOXML documents and XPS documents and handle<br>
>> them by MS-Office and XPS viewers.<br>
>><br>
>> Here is my F# program.<br>
>><br>
>> open System.IO.Packaging<br>
>> open System<br>
>><br>
>> let readOPC() =<br>
>>     let package = Package.Open("f:test.opc", IO.FileMode.Open)<br>
>>     let uri = new Uri(Uri.EscapeUriString "/f$B$"(B/f1", UriKind.Relative)<br>
>>     let part =  package.GetPart(uri)<br>
>>     let enum = part.GetRelationships().GetEnumerator()<br>
>>     while (enum.MoveNext()) do<br>
>>         let relship = enum.Current<br>
>>         let targetURI = relship.TargetUri<br>
>>         try<br>
>>             let targetPart = package.GetPart(targetURI)<br>
>>             let s = targetPart.GetStream()<br>
>>             System.Console.WriteLine("Success: {0} {1}", targetURI,<br>
>> s.ReadByte())<br>
>>         with<br>
>>             | :? System.ArgumentException -><br>
>> System.Console.WriteLine("Error: {0}", targetURI)<br>
>>     package.Close()<br>
>><br>
>> readOPC()<br>
>><br>
>><br>
>> Regards,<br>
>> Makoto<br>
><br>
> -----Original Message-----<br>
> From: <a href="mailto:eb2mmrt@gmail.com">eb2mmrt@gmail.com</a> [mailto:<a href="mailto:eb2mmrt@gmail.com">eb2mmrt@gmail.com</a>] On Behalf Of MURATA<br>
> Makoto<br>
> Sent: Tuesday, December 24, 2013 4:16 AM<br>
> To: SC34<br>
> Subject: OPC part names and referenes<br>
><br>
> Dear colleagues,<br>
><br>
> Merry Christmas!<br>
><br>
> I am trying to implement Section 2 of the Japanese proposal<br>
> (<a href="http://kikaku.itscj.ipsj.or.jp/sc34/wg4/archive/sc34-wg4-2011-0207.ht" target="_blank">http://kikaku.itscj.ipsj.or.jp/sc34/wg4/archive/sc34-wg4-2011-0207.ht</a><br>
</div></div>> ml) for improving part names and referenes.<br>
<div class=""><div class="h5">><br>
> While doing so, I studied the conversion from part references (which are relative) to part names again.  Here are some random thoughts.<br>
><br>
> 1) Leading "/"<br>
><br>
> In Seattle, we learned from OPC experts that references beginning with "/" and those not beginning with it are resolved differently.<br>
><br>
><br>
> Proposal: Explicitly state differences between these two types of references.  A reference to RFC 3986 is not good enough.<br>
><br>
> 2) Resolution of relative URI referennces<br>
><br>
> Neither OPC part references (or Unicode strings as specified in Annex A) nor OPC part names contain schemes (e.g., http:).  Should we nevertheless rely on resolution of relative URI references for the conversion from OPC part references to OPC part names?  In other words, should we first create aboslute URIs thus introducing schemes and then construct OPC part names by removing schemes?<br>

><br>
> Proposal: Stop relying on resolution of relative URI references.<br>
> Rather, introduce "base OPC part name", which is the OPC part name of the containing OPC part, and introduce a procedure for merging base OPC part names and OPC part references.  This processing model does not have to touch schemes.<br>

><br>
> 3) xml:base<br>
><br>
> Do we really have to allow xml:base (and other similar mechanisms) to change the interpretation of OPC part references?  If such a mechaism specifies irrelevant URIs such as <a href="http://www.example.com" target="_blank">http://www.example.com</a>, how should we interpret OPC part references?<br>

><br>
> Proposal: Stop using xml:base (and other similar mechanisms).<br>
><br>
><br>
> Regards,<br>
> Makoto<br>
<br>
<br>
<br>
--<br>
<br>
Praying for the victims of the Japan Tohoku earthquake<br>
<br>
Makoto<br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><br>Praying for the victims of the Japan Tohoku earthquake<br><br>Mako</div></div>