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
Java 为XPath计算设置当前节点_Java_Xslt_Xpath_Xalan_Jaxp - Fatal编程技术网

Java 为XPath计算设置当前节点

Java 为XPath计算设置当前节点,java,xslt,xpath,xalan,jaxp,Java,Xslt,Xpath,Xalan,Jaxp,给定一个节点列表和该列表中的当前节点,是否有方法使用javax.xml.xpath或org.apache.xpath来计算位置相关的xpath表达式,例如: position()=last()-1 javax.xml.xpath包含: evaluateString表达式,对象项,QName返回类型 在指定的上下文中计算XPath表达式,并将结果作为指定的类型返回 我想我可以创建一个临时节点,将节点列表中的节点添加为子节点,并将与当前节点对应的子节点传递给上下文进行求值,但假设即使有效,还有更好

给定一个节点列表和该列表中的当前节点,是否有方法使用javax.xml.xpath或org.apache.xpath来计算位置相关的xpath表达式,例如:

position()=last()-1
javax.xml.xpath包含:

evaluateString表达式,对象项,QName返回类型 在指定的上下文中计算XPath表达式,并将结果作为指定的类型返回

我想我可以创建一个临时节点,将节点列表中的节点添加为子节点,并将与当前节点对应的子节点传递给上下文进行求值,但假设即使有效,还有更好的方法吗

或者,在XSLT1.0中,假设我将这三件事作为变量,即节点列表、节点和xpath表达式作为字符串。是否可以使用节点列表作为上下文将此表达式应用于节点,并将结果作为变量获取?

Xalan Java支持,因此您应该能够使用例如

<xsl:variable name="nodes" select="/root/foo/bar"/>
<xsl:variable name="expression" select="concat('$nodes/', $yourPath)"/>
<xsl:variable name="result" select="dyn:evaluate($expression)"/>
使用xmlns:dyn=http://exslt.org/dynamic 当然可以

这有用吗?我不确定我是否理解拥有一个节点列表和一个节点并希望将两者都用作上下文的部分

至于Java端,并在DOM节点列表中查找位于最后一个节点之前的节点,NodeList.getItemnodeList.getLength-2是否就足够了

<xsl:variable name="nodes" select="/root/foo/bar"/>
<xsl:variable name="expression" select="concat('$nodes/', $yourPath)"/>
<xsl:variable name="result" select="dyn:evaluate($expression)"/>
使用xmlns:dyn=http://exslt.org/dynamic 当然可以

这有用吗?我不确定我是否理解拥有一个节点列表和一个节点并希望将两者都用作上下文的部分


至于Java端,在DOM节点列表中查找位于最后一个节点之前的节点,NodeList.getItemnodeList.getLength-2是否就足够了?

大多数XPath API,当然还有JAXP API,只允许您设置一个单例焦点,即可以选择任何项作为上下文项的焦点,但是上下文位置和大小固定为1。

大多数XPath API,当然还有JAXP API,只允许您设置一个单例焦点,即可以选择任何项作为上下文项的焦点,但上下文位置和大小固定为1。

建议可以使用特定于Xalan的非XSLT解决方案,但是实现的独立性和Michael的回应促使我寻找一个基于XSLT1的解决方案

在这里;我不确定它是否对其他人有用。我想知道是否有更简单的方法

只要一切设置正确,就可以依赖XSLT。根据规范:

在XSLT中,一种最外层的表达式,即不是部分的表达式 另一个表达式的上下文如下所示:

上下文节点来自当前节点

上下文位置来自当前节点在中的位置 当前节点列表;第一个位置是1

从末尾开始,我得到将表达式$expression应用到变量$result中的结果:

        <xsl:variable name="result" >
            <xsl:apply-templates select="$vNodeSet" mode="myeval">
                <xsl:with-param name="expression" ><xsl:value-of select="$expression"/></xsl:with-param>
                <xsl:with-param name="pos" ><xsl:value-of select="$pos"/></xsl:with-param>
            </xsl:apply-templates>
        </xsl:variable> 
应用模板将适当的当前节点列表推送到以下模板:

  <xsl:template match="*" mode="myeval">
    <xsl:param name="expression">1. </xsl:param>
    <xsl:param name="pos">3</xsl:param>

    <xsl:choose>
        <xsl:when test="position()=$pos">
            <xsl:value-of select="dyn:evaluate($expression)" /></xsl:when>
        <xsl:otherwise /> 
    </xsl:choose>

  </xsl:template>
此模板计算要成为当前节点的节点的表达式。注意:

dy的用法:谢谢马丁! $pos,它将我想要的标识为当前节点。 我能够根据前面的问题计算$pos;我还使用了他的变量名vNodeSet

谢谢迪米特、马丁和迈克尔

建议可以使用特定于Xalan的非XSLT解决方案,但实现独立性和Michael的回应将我推向了寻找基于XSLT1的有效解决方案的方向

在这里;我不确定它是否对其他人有用。我想知道是否有更简单的方法

只要一切设置正确,就可以依赖XSLT。根据规范:

在XSLT中,一种最外层的表达式,即不是部分的表达式 另一个表达式的上下文如下所示:

上下文节点来自当前节点

上下文位置来自当前节点在中的位置 当前节点列表;第一个位置是1

从末尾开始,我得到将表达式$expression应用到变量$result中的结果:

        <xsl:variable name="result" >
            <xsl:apply-templates select="$vNodeSet" mode="myeval">
                <xsl:with-param name="expression" ><xsl:value-of select="$expression"/></xsl:with-param>
                <xsl:with-param name="pos" ><xsl:value-of select="$pos"/></xsl:with-param>
            </xsl:apply-templates>
        </xsl:variable> 
应用模板将适当的当前节点列表推送到以下模板:

  <xsl:template match="*" mode="myeval">
    <xsl:param name="expression">1. </xsl:param>
    <xsl:param name="pos">3</xsl:param>

    <xsl:choose>
        <xsl:when test="position()=$pos">
            <xsl:value-of select="dyn:evaluate($expression)" /></xsl:when>
        <xsl:otherwise /> 
    </xsl:choose>

  </xsl:template>
此模板计算要成为当前节点的节点的表达式。注意:

dy的用法:谢谢马丁! $pos,它将我想要的标识为当前节点。 我能够根据前面的问题计算$pos;我还使用了他的变量名vNodeSet


谢谢迪米特、马丁和迈克尔

Jason,一些评论:与其简单地使用,不如缩短编写时间,提高效率。同样的方法也可以用于第二个xsl:with-param。我想如果你想做的就是把dyn:求值应用到你节点集中的某个节点上,你只需要加号。谢谢
锡我想我已经试过了,但是用Xalan没用,尽管我可能弄错了。Jason,一些评论:与其简单地使用,不如缩短编写时间,提高效率。同样的方法也可以用于第二个xsl:with-param。我想如果你想做的就是把dyn:求值应用到你节点集中的某个节点上,你只需要加号。谢谢Martin。我想我先试过了,但是使用Xalan没有用,尽管我可能弄错了。