Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 使用../的备选方案/_Xslt_Uri - Fatal编程技术网

Xslt 使用../的备选方案/

Xslt 使用../的备选方案/,xslt,uri,Xslt,Uri,在我当前的配置中,我有一个include语句: <xsl:include href="../../../specialdata/anotherfolder/template.xslt"/> 我怎样才能在这里用一个表达式来表示:“沿路径遍历,直到达到文件夹'specialdata'所在的级别”在您的情况下,href属性只是一个URL,在您的情况下是一个相对URL。我认为URL没有搜索某个文件夹的方法 href属性只是一个URL,在您的例子中是一个相对URL。我认为URL没有搜索某

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

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


我怎样才能在这里用一个表达式来表示:“沿路径遍历,直到达到文件夹'specialdata'所在的级别”

在您的情况下,
href
属性只是一个URL,在您的情况下是一个相对URL。我认为URL没有搜索某个文件夹的方法

href属性只是一个URL,在您的例子中是一个相对URL。我认为URL没有搜索某个文件夹的方法

不。相对URI无法做到这一点

不过,您可能会发现这样做很方便:

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


或者从模板所在站点的根开始,而不是从当前模板开始的其他内容


或者,这可能不太方便,这取决于模板的位置是如何构造的,它们是否在不同的位置作为一个组使用,等等。

否。相对URI无法做到这一点

不过,您可能会发现这样做很方便:

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


或者从模板所在站点的根开始,而不是从当前模板开始的其他内容

或者,这可能不太方便,这取决于模板的位置是如何构造的,它们是否在不同的位置作为一个组使用,等等。

我不(非常)同意前面的答案,有一些方法可以实现这一点,既有标准的(使用XSLT 3.0)也有依赖于处理器的(使用
UriResolver
)对于较旧的处理器

使用XSLT 1.0和2.0: 通常,XSLT处理器允许您从任何位置返回某些内容 基于
href
属性,使用
UriResolver
。它取决于如何创建、编译和配置此类组件所使用的处理器。通常它意味着使用本机语言(java,C++,c~())来实现一个接口,并将转换配置为使用它作为默认的代码> uriRever 在为
UriResolver
编写的代码中,您可以做任何您想做的事情,包括遍历不同的父目录以检查部分URI是否匹配

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

使用XSLT 3.0,使用强大的阴影属性 或者,在XSLT 3.0中有一个属性(以下划线开头的属性可以采用在静态求值阶段处理的属性值模板)

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

如果“静态可用文档”(可能受到处理器的限制)包括本地路径上的文档,则XSLT 3.0中可以使用以下内容:

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

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

上述代码段的工作原理如下:

  • 创建一个静态变量,该变量必须在使用前声明,包含路径的已知部分
  • 创建一系列相对父路径
  • 当路径包含
    template.xslt
  • 返回第一个找到的
  • 将点路径连接到
    $include
    变量(使用XSLT 3.0
    |
    运算符)
  • 结果是包含包含文件的现有路径(或空序列,否则将产生错误)的字符串
  • 阴影属性的结果成为真实属性的值
    href
请注意,如果没有扩展函数,则无法检查目录是否存在,但在您的情况下,这无关紧要,因为如果目录存在,则仅当文件也存在时调用才有意义,因此我们也可以检查整个路径

已知的支持阴影属性的XSLT 3.0处理器有(.NET)和(主要是Java)。其他XSLT 3.0处理器,如和(都非常部分地支持XSLT 3.0)不支持阴影属性(但)。

我不(非常)同意前面的答案,有一些方法可以实现这一点,对于较旧的处理器,既有标准的(使用XSLT 3.0)也有依赖于处理器的(使用
UriResolver

使用XSLT 1.0和2.0: 通常,XSLT处理器允许您从任何位置返回某些内容 基于
href
属性,使用
UriResolver
。它取决于如何创建、编译和配置此类组件所使用的处理器。通常它意味着使用本机语言(java,C++,c~())来实现一个接口,并将转换配置为使用它作为默认的代码> uriRever 在为
UriResolver
编写的代码中,您可以做任何您想做的事情,包括遍历不同的父目录以检查部分URI是否匹配

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

使用XSLT 3.0,使用强大的阴影属性 或者,在XSLT 3.0中有一个属性(以下划线开头的属性可以采用在静态求值阶段处理的属性值模板)

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