仅使用XSL读取远程压缩xml

仅使用XSL读取远程压缩xml,xml,xslt,xslt-2.0,Xml,Xslt,Xslt 2.0,我想知道XSLT文件是否可以从远程zip文件夹中的XML(从工作中的服务器)读取数据,而无需任何外部处理器(saxon等),也无需下载 如果做不到这一点,我将求助于仅仅从zip读取信息。。。这就引出了我的另一个(新手)问题 我目前有一个XSLT,可以从下载和提取的XML文件中访问和获取数据,但如果不提取它,我就无法做到这一点。我已经了解到,使用Altova和xslt 2.0,可以使用document()函数从zip文件中读取数据,但到目前为止,我还无法实现这一点 这就是我试图做到的: 文档('n

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

如果做不到这一点,我将求助于仅仅从zip读取信息。。。这就引出了我的另一个(新手)问题

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

这就是我试图做到的: 文档('name.zip | zip/folder/folder2/iwanthis.xml')

只是好像找不到文件。如果你告诉我我的错误并引导我进入XSLThood,我将永远感激你


非常感谢

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


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

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

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


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

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

以下是一个例子:

<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>

我刚刚使用以下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版本2010 rel.3”进行了测试,我认为这是最新版本

通过阅读您的所有(非常快的)回复,我得到了答案,并且由于仅使用XSLT就得到了“可能不可能”的答案和萨克森式的谈话,我想萨克森式的方法就是这样。我会先在家里试试,看看安装/使用有多麻烦,因为通常每当我提到在工作中安装东西时,他们都会拒绝我(我是实习生)。不过,我会等到马丁·霍宁回答我的评论

非常感谢您抽出时间,也感谢您这么快地回答


编辑:谢谢Martin,我将查看该功能的文档。

好问题(+1)。请参阅我的答案,了解使用EXPath的解决方案。我对你的答案有点困惑。“我得到的输出是该文件的内容”是什么意思?它工作了吗,比如,您可以从xml中查找任何需要的内容?我这样问是因为在那之后,你说当路径无法解决时,你出现了一个错误。不确定你是否成功。我得到的错误(使用大致相同的方法:“foreach”而不是“copyof”)是类似于“无法找到声明的资源”(已翻译)。我想这和你得到的是一样的(他们是愚蠢的德国人,错误描述)。另外,我正在使用Altova XMLspy 2007。感谢AltovaXML工具的声明版本,我能够以我展示的方式访问zip文档中的XML数据。我不知道Altova XML Spy 2007是否支持这一点,请查看文档或在Altova支持论坛中询问。我刚刚意识到,似乎这是我唯一关注的地方。我确实在网上冲浪过很多次,然后才在这里发帖。好的,我只是想澄清一下。