Jsp 构建动态xPath
我必须根据XSL文件中的请求属性使xPath动态化,并使用表达式语言生成JSP。所以现在我有一件事: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: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">
一般来说,你做不到。但有一些特定于供应商的解决方案:
<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">
一般来说,你做不到。但有一些特定于供应商的解决方案:
<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引擎/版本是什么?