Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.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
Jsp 构建动态xPath_Jsp_Xslt_Xpath_El_Dynamically Generated - Fatal编程技术网

Jsp 构建动态xPath

Jsp 构建动态xPath,jsp,xslt,xpath,el,dynamically-generated,Jsp,Xslt,Xpath,El,Dynamically Generated,我必须根据XSL文件中的请求属性使xPath动态化,并使用表达式语言生成JSP。所以现在我有一件事: <xsl:variable name="xPath">@name='${categoryName}'</xsl:variable> <xsl:for-each select="tar:products/category[$xPath]/subcategory"> 当请求参数categoryName等于'Toys'时,预期输出: 实际产量: 决议 在

我必须根据XSL文件中的请求属性使xPath动态化,并使用表达式语言生成JSP。所以现在我有一件事:

<xsl:variable name="xPath">@name='${categoryName}'</xsl:variable>
<xsl:for-each select="tar:products/category[$xPath]/subcategory">

当请求参数
categoryName
等于
'Toys'
时,预期输出:


实际产量:


决议

在我的java类中,我在转换之前将参数放入请求中,但只需将其放入transformator参数中:

transformer.setParameter("categoryName", name);

如果确实需要动态构建XPath,则需要使用扩展函数。例如,您可以使用

然而,看一下您相当简洁的代码示例,我不确定您在本例中是否需要额外的复杂性。能否将两行内容简化为以下内容:

<xsl:for-each select="tar:products/category[@name=$categoryName]/subcategory">

如果确实需要动态构建XPath,则需要使用扩展函数。例如,您可以使用

然而,看一下您相当简洁的代码示例,我不确定您在本例中是否需要额外的复杂性。能否将两行内容简化为以下内容:

<xsl:for-each select="tar:products/category[@name=$categoryName]/subcategory">

一般来说,你做不到。但有一些特定于供应商的解决方案:

  • 蒂姆提到EXSLT是绝对正确的。(dyn:evaluate())
  • XALAN具有求值功能(请参阅:)
  • Saxon有一个求值函数()
  • 另请参见Dimitre对以下问题的回答:

    还要注意的是,XSLT 3.0将具有和evaluate()函数()

    最后,如果要计算的动态XPATH被限制为非常简单的形式(例如:由/运算符分隔的术语,没有轴,也没有谓词),则可以编写命名模板来执行动态XPATH计算。但当然,这个模板的外观在很大程度上取决于您对表达式的简单约束

    例子: 以动态路径为例:

    <xsl:variable name="xPath">@name='${categoryName}'</xsl:variable>
    
    @name='${categoryName}'
    
    假设属性名部分(“本示例中的name”)和值部分(我认为您指的是$categoryName而不是${categoryName})都是变量,但整体形式是其他表达式,换句话说:@some name='some-string-value'是固定的。然后可以解析路径表达式,如下所示:

    <xsl:variable name="name" select="'name'" /><!-- or use another computed value. -->
    <xsl:variable name="value" select="'my-category-name'" /><!-- or use another computed value. -->
    <xsl:for-each select="tar:products/category[@*[name()=$name][.=$value]]/subcategory">
    

    一般来说,你做不到。但有一些特定于供应商的解决方案:

  • 蒂姆提到EXSLT是绝对正确的。(dyn:evaluate())
  • XALAN具有求值功能(请参阅:)
  • Saxon有一个求值函数()
  • 另请参见Dimitre对以下问题的回答:

    还要注意的是,XSLT 3.0将具有和evaluate()函数()

    最后,如果要计算的动态XPATH被限制为非常简单的形式(例如:由/运算符分隔的术语,没有轴,也没有谓词),则可以编写命名模板来执行动态XPATH计算。但当然,这个模板的外观在很大程度上取决于您对表达式的简单约束

    例子: 以动态路径为例:

    <xsl:variable name="xPath">@name='${categoryName}'</xsl:variable>
    
    @name='${categoryName}'
    
    假设属性名部分(“本示例中的name”)和值部分(我认为您指的是$categoryName而不是${categoryName})都是变量,但整体形式是其他表达式,换句话说:@some name='some-string-value'是固定的。然后可以解析路径表达式,如下所示:

    <xsl:variable name="name" select="'name'" /><!-- or use another computed value. -->
    <xsl:variable name="value" select="'my-category-name'" /><!-- or use another computed value. -->
    <xsl:for-each select="tar:products/category[@*[name()=$name][.=$value]]/subcategory">
    

    如果需求是用“虚构的”代码编写的,那么总是很难回答这个问题,也就是说,代码是用一种不完全是XSLT的语言编写的。所以这个答案假设我已经正确地想象了你想要做什么。如果是这种情况,请更换:

    <xsl:variable name="xPath">@name='${categoryName}'</xsl:variable>
    <xsl:for-each select="tar:products/category[$xPath]/subcategory">
    
    @name='${categoryName}'
    
    据此:

    <xsl:for-each select="tar:products/category[@name = $categoryName]/subcategory">
    
    
    

    对于更一般的问题,XSLT中没有从字符串动态生成XPath表达式的标准工具。但许多产品都提供了扩展函数来实现这一点:例如,请参见saxon:evaluate()。

    如果需求是用“虚构”代码编写的,那么总是很难回答这个问题,也就是说,用一种不完全是XSLT的语言编写的代码。所以这个答案假设我已经正确地想象了你想要做什么。如果是这种情况,请更换:

    <xsl:variable name="xPath">@name='${categoryName}'</xsl:variable>
    <xsl:for-each select="tar:products/category[$xPath]/subcategory">
    
    @name='${categoryName}'
    
    据此:

    <xsl:for-each select="tar:products/category[@name = $categoryName]/subcategory">
    
    
    

    对于更一般的问题,XSLT中没有从字符串动态生成XPath表达式的标准工具。但许多产品提供了扩展功能来实现这一点:例如,请参见saxon:evaluate()。

    Hello!谢谢你的时间,但是对不起,这不起作用。它给了我一个没有任何错误的空白列表,categoryName是一个请求参数,我正试图在EL的帮助下得到它。据我所知,您建议将其定义为xsl变量。我做了,但没用……我想如果你能把问题扩大到更多细节,会有帮助的。例如,显示输入XML和预期输出将使事情更加清楚。您好!谢谢你的时间,但是对不起,这不起作用。它给了我一个没有任何错误的空白列表,categoryName是一个请求参数,我正试图在EL的帮助下得到它。据我所知,您建议将其定义为xsl变量。我做了,但没用……我想如果你能把问题扩大到更多细节,会有帮助的。例如,显示输入XML和预期输出将使事情更加清楚。您的XSLT引擎/版本是什么?您的XSLT引擎/版本是什么?