3

我想知道 XSLT 文件是否可以从位于远程 zip 文件夹中的 XML 读取数据(来自工作中的服务器),无需任何外部处理器(saxon 等)且无需下载。

如果做不到这一点,我将求助于从 zip 中读取信息......这将我带到了我的另一个(newb)问题。

我目前有一个 XSLT,它可以访问并从下载和提取的 XML 文件中获取数据,但如果不提取它,我就无法做到这一点。我已经读过 Altova 和 xslt 2.0 可以使用 document() 函数从 zip 文件中读取,但到目前为止我还没有实现这一点。

这就是我尝试这样做的方式: document('name.zip|zip/folder/folder2/iwantthis.xml')

它似乎没有找到该文件。如果您向我展示我的方法的错误并引导我进入 XSLThood,我将永远感激不尽。

非常感谢你

4

5 回答 5

2

我认为没有一种通用的方法可以做到这一点。

但是,在许多基于 Java 的 XSLT 处理器(至少是 Saxon 和 Xalan)中,您可以使用'jar:' URL来引用 zip 文件中的资源。在指向 zip 文件的 URL 前面加上前缀jar:和后缀,!/以及其中文件的路径。像这样:jar:file:///the/path/to/foo.zip!/foo.xml

要在其他处理器中实现相同的功能,您可能需要确定它们是否允许注册自定义“URI 处理程序”或等效的处理您想要支持的特殊 URI。

于 2010-06-10T10:28:48.140 回答
1

如果您使用的是 Saxon,那么您可以使用EXPath Zip Facility

这是一个例子:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns:xs="http://www.w3.org/2001/XMLSchema" 
                xmlns:zip="http://www.expath.org/mod/zip"
                version="2.0">

   <xsl:import href="http://www.expath.org/mod/zip.xsl"/>

   <xsl:output indent="yes"/>

   <!--
       $file is the ZIP file to use.  If $entry is set, extract that
       entry from $file, as an XML document.  If not, list the content
       of $file.
   -->
   <xsl:param name="file"  as="xs:string"/>
   <xsl:param name="entry" as="xs:string?"/>

   <xsl:template name="main" match="/">
      <xsl:choose>
         <xsl:when test="$entry">
            <!-- an XML entry in the ZIP file -->
            <xsl:sequence select="zip:xml-entry($file, $entry)"/>
         </xsl:when>
         <xsl:otherwise>
            <!-- the structure of the ZIP file -->
            <xsl:sequence select="zip:entries($file)"/>
         </xsl:otherwise>
      </xsl:choose>
   </xsl:template>

</xsl:stylesheet>
于 2010-06-10T12:46:45.133 回答
1

除非您的文件系统提供了一种本地、透明的方式来访问 zip 文件,就像它是一个文件夹一样,否则这是不可能的。

换句话说:您必须能够document()在系统上的任何其他程序中打开您尝试输入的路径。如果这在其他任何地方都不起作用,那么您会认为它会在 XSLT 中起作用吗?

于 2010-06-10T09:14:26.610 回答
0

我刚刚使用以下 XSLT 2.0 样式表尝试了 AltovaXML 工具命令行 XSLT 2.0 处理器:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0">

  <xsl:template name="main">
    <xsl:copy-of select="document('ziptest1.zip|zip/ziptest1/file.xml')"/>
  </xsl:template>

</xsl:stylesheet>

其中“ziptest1.zip”是一个 .zip 文件,其中包含一个名为“ziptest1”的文件夹,其中包含一个名为“file.xml”的文件,我得到的输出是该文件的内容。如果无法解析路径,则会收到一条错误消息,提示“检索资源时出错”。

我使用“AltovaXML Version 2010 rel. 3”对其进行了测试,我认为这是最新版本。

于 2010-06-10T17:09:15.550 回答
0

根据我通过阅读您的所有(非常快速的)回复得到的信息,并且由于单独使用 XSLT 会引发“可能不可能”的答案和撒克逊谈话,我猜撒克逊是要走的路。我会先在家里尝试一下,看看安装/使用有多少麻烦,因为通常每当我提到在工作中安装某些东西时,他们都会拒绝我(我是实习生)。不过,我会等到 Martin Honnen 回答我的评论。

非常感谢您抽出宝贵的时间,也非常感谢您如此迅速地回答。

编辑:谢谢马丁,将检查该功能的文档。

于 2010-06-11T09:31:04.790 回答