只用XSL读取一个远程压缩的xml

时间:2010-06-10 08:53:37

标签: xml xslt xslt-2.0

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

如果做不到这一点,我只会从拉链中读取信息......这会将我带到另一个(新的)问题。

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

这就是我尝试这样做的方式: 文件( 'name.zip |拉链/文件夹/文件夹2 / iwantthis.xml')

它似乎没有找到该文件。如果你向我展示我的方式错误并引导我进入XSLThood,我几乎会永远感激。

谢天谢地

5 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分: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>

答案 3 :(得分: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”进行了测试,我认为这是最新版本。

答案 4 :(得分:0)

通过阅读你所有的(非常快速的)回复得到的结果,并且由于单独使用XSLT引出了“可能不可能”的答案和Saxon-talk,我认为Saxon是可行的。我会先在家里试一试,看看安装/使用多少麻烦,因为通常每当我提到在工作中安装一些东西时,他们都会让我失望(我是实习生)。我会等到Martin Honnen回答我的评论。

非常感谢您的时间和回答如此迅速。

编辑:感谢Martin,将检查该功能的文档。