替代使用../../

时间:2015-08-11 11:24:28

标签: xslt uri

在我当前的配置中,我有一个include语句:

<xsl:include href="../../../specialdata/anotherfolder/template.xslt"/>

如何在此处创建一个表达式:“遍历路径,直到您处于'specialdata'文件夹所在的级别?”

3 个答案:

答案 0 :(得分:0)

href属性只是一个URL,在您的情况下是一个相对URL。我不认为网址有某种搜索特定文件夹的方式。

答案 1 :(得分:0)

没有。使用相对URI无法做到这一点。

你可能会觉得做以下事情很方便:

<xsl:include href="/specialdata/anotherfolder/template.xslt"/>

或者

<xsl:include href="/templates/specialdata/anotherfolder/template.xslt"/>

或者从模板上找到的网站根目录开始的其他内容,而不是从当前模板开始。

或者这可能不太方便,取决于模板的方式&#39;位置是结构化的,无论它们是否在不同地点用作一组,等等。

答案 2 :(得分:0)

我(完全)同意以前的答案,有很多方法可以实现这一点,包括标准(使用XSLT 3.0)和处理器相关(使用UriResolver)旧处理器。 / p>

使用XSLT 1.0和2.0:

通常,XSLT处理器允许您从任何位置返回内容 使用href基于UriResolver属性。它取决于您在如何创建,编译和配置此类组件时使用的处理器。通常它意味着使用本机语言(Java,C ++,C#)来实现接口并配置转换以将其用作默认UriResolver的替代。

在为UriResolver编写的代码中,您可以执行任何操作,包括遍历不同的父目录以检查部分URI是否匹配。

请记住,XSLT不会在此处获取URL,而是采用URI。它的位置不是由URI预定义的,事实上,URI被称为具有到物理位置的映射,物理位置可以是文件,内存中的XML树,数据库字段等。

使用XSLT 3.0,使用强大的阴影属性

或者,在XSLT 3.0中有一个cross-platform solution with shadow attributes(以下划线开头的属性可以采用在静态评估阶段处理的属性值模板。)

阴影属性的一个限制是它无法调用样式表函数(您使用xsl:function声明的函数),但可以调用任何XPath函数,并且每个合法的XPath表达式也是合法的静态表达式。

以下适用于XSLT 3.0,前提是&#34;静态可用的文档&#34; (可能受处理器限制)包括本地路径上的文档:

<xsl:variable name="include" 
    static="yes" 
    select=" 'specialdata/anotherfolder/template.xslt' " />

<!-- note the underscore -->
<xsl:include _href="{
    ('../', '../../', '../../../') 
    [document-available(. || $include)][1]
    || $include }" />

上面的代码段如下:

  • 创建一个静态变量,必须在之前声明它的使用,包含路径的已知部分
  • 创建一系列相对父路径
  • 当路径包含template.xslt
  • 时,让谓词返回true
  • 返回第一个找到的
  • 连接(使用XSLT 3.0 ||运算符)$include变量的虚线路径
  • result是一个字符串,其中包含一个现有路径(否则将产生一个空序列,这会产生错误)到include文件
  • shadow属性的结果将成为真实属性href的值。

注意,如果没有扩展函数,则无法检查目录是否存在,但在您的情况下,它很重要,因为如果目录存在,只有文件存在时调用才有意义,所以我们可以并检查整个路径。

支持影子属性的已知XSLT 3.0处理器是Exselt(.NET)和Saxon(主要是Java)。其他XSLT 3.0处理器(如XMLPrimeAltova Raptor(都支持非常局部的XSLT 3.0)不支持阴影属性。