document() function for a file on another computer/server

落花浮王杯 提交于 2019-12-12 05:31:34

问题


I understand the use of document() as follows.

<xsl:value-of select="document('path\to\docuemnt.xml')/RootElement/Element"/>

And this has to be a relative path to the parent XSL file. But what if I need to reference a file which is hosted on another server on the local network? I've tried such things as.

<xsl:value-of select="document('\\servername\path\to\document.xml')/RootElement/Element"/>

But this throws an error, because it looks in

C:\path\to\xsl\\servername\path\to\document.xml

Which of course doesn't exist.


回答1:


This solution only relates to the Saxon-HE 9.4.0.3N XSLT processor, in the console application form, on Windows 7.

In my experimentation, I found that the document() function will accept file names or URIs. However I would avoid filenames because they need to be short-form. If you use long-form, the file-name will be rejected.

Suppose your document is ...

c:\path\to\document.xml

on server 'servername' which is mapped to drive 'j'.

To form a URI from this use as the document() parameter value...

file:///j:/path/to/document.xml

In relation to the URI, I was mistaken about Saxon not accepting long-form. This only applies to filenames. However, there are a number of gotchas...

  1. Note the forward slashes. Backslashes will not work.
  2. I have not found a way to build a workable file: URI with just UNC names. You need to make a drive mapping to a letter.
  3. Any failure to open the document for any reason will be reported as the same error. With file system, there are so many things that can go wrong, that if you can't open the file, it is not safe to assume that the URI is wrong. There could be many mundane reasons why a file cannot be opened at a particular time.
  4. Beware of firewall issues. These play a role.
  5. Many text editors, such as NotePad++ assume, in the absence of a BOM and not encoded in one of the two UTF-16 encodings, that a text file is encoded in the system code-page. Saxon will make the default assumption that the file is encoded in UTF-8 so if you have a character that looks like this in NotePad++ (ä) with my code-page, Saxon will spit the dummy, and report that it is unable to open the file. (Aside: I'm not sure what my code-page is. My o/s is Win7 and the Current system locale is English (Australia). It is the system local that determines the system code-page). The reason why Saxon will not open the document is that the (ä) encoded in some code-page results in a sequence of bytes which is not a valid UTF-8 sequence.
  6. URI paths which are not URL paths are not supported by the underlying operating system. Saxon may well truthfully say that it supports URIs in relation to the document() function, but that doesn't boil any cabbages, because in practice, you can't use them. - Well at least not on the windows family of o/s.
  7. Please ignore the MSDN page on the file protocol. The form of URL suggested on that page (with the | character etc) is not accepted by the Saxon document() function. Use the form that I have suggested above. I have tested it and it works.



回答2:


Your understanding of document() is incorrect. It expects a URI, not a filename.



来源:https://stackoverflow.com/questions/12348024/document-function-for-a-file-on-another-computer-server

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!