Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.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 XSLT:使用xpath表达式提取同级节点的最后x位_Java_Xml_String_Xslt_Xpath 2.0 - Fatal编程技术网

Java XSLT:使用xpath表达式提取同级节点的最后x位

Java XSLT:使用xpath表达式提取同级节点的最后x位,java,xml,string,xslt,xpath-2.0,Java,Xml,String,Xslt,Xpath 2.0,我试图用xpath提取“红色”同级的最后4个数字 源xml如下所示: ... <node2> <key><![CDATA[RED]]></key> <value><![CDATA[98472978241908]]></value> ... more key value pairs here... </node2> ... 我认为有一个小错误,但我看不出在哪里。我跟踪

我试图用xpath提取“红色”同级的最后4个数字

源xml如下所示:

... 
<node2>
    <key><![CDATA[RED]]></key>
    <value><![CDATA[98472978241908]]></value>

    ... more key value pairs here...  

</node2>
...
我认为有一个小错误,但我看不出在哪里。我跟踪了SO和其他学校(w3schools)的许多讨论,并试图遵循建议,但没有成功

更新:上下文:

我使用以下标识将所有节点从源XML复制到目标(XML) 我在xsl:template中为某些节点应用特定规则:

<!-- This copy the whole source XML in destination  -->
    <xsl:template match="node() | @*">
        <xsl:copy>
            <xsl:apply-templates select="node() | @*" />
        </xsl:copy>
    </xsl:template>

    <!-- specific rules for some nodes -->

    <xsl:template match="/nodeDetails">
        <mynewnode>
            <!-- here I take the whole value and it s working -->
            <someVal><xsl:value-of select="/nodeDetails/nodeX/key[text()='ANOTHER_KEY']/following-sibling::value" /></someVal>
            <!-- FIXME substring does not work now -->
            <redVal><xsl:value-of select="/nodeDetails/nodeX/key[text()='RED']/following-sibling::value/text()[substring(.,string-length(.)-4)]" /></redVal>
        </mynewnode>
    </xsl:template>

您当前的XPath将计算为节点集,但您需要的是字符串。请尝试以下方式:

<xsl:variable name="value" 
              select="/nodelevelX/nodelevelY/node2/key[. = 'RED']
                      /following-sibling::value[1]" />
<xsl:value-of select="substring($value, string-length($value) - 3)" />


虽然为了确定答案,我需要查看XSLT中您试图输出此值的部分。

您当前的XPath将计算为节点集,但您需要的是字符串。请尝试以下方式:

<xsl:variable name="value" 
              select="/nodelevelX/nodelevelY/node2/key[. = 'RED']
                      /following-sibling::value[1]" />
<xsl:value-of select="substring($value, string-length($value) - 3)" />


虽然为了确定答案,我需要查看XSLT中试图输出此值的部分。

使用此XPath 2.0表达式:

/nodelevelX/nodelevelY/node2/key[text()='RED']
                    /following-sibling::*[1][self::value]
                            /substring(., string-length() -3)
<nodelevelX>
    <nodelevelY>
        <node2>
            <key>GREEN</key>
            <value>0123456789</value>
            <key>RED</key>
            <value>98472978241908</value>
            <key>BLACK</key>
            <value>987654321</value>
        </node2>
    </nodelevelY>
</nodelevelX>
基于XSLT2.0的验证:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "/nodelevelX/nodelevelY/node2/key[text()='RED']
                    /following-sibling::*[1][self::value]
                            /substring(., string-length() -3)"/>
 </xsl:template>
</xsl:stylesheet>
1908

使用此XPath 2.0表达式

/nodelevelX/nodelevelY/node2/key[text()='RED']
                    /following-sibling::*[1][self::value]
                            /substring(., string-length() -3)
<nodelevelX>
    <nodelevelY>
        <node2>
            <key>GREEN</key>
            <value>0123456789</value>
            <key>RED</key>
            <value>98472978241908</value>
            <key>BLACK</key>
            <value>987654321</value>
        </node2>
    </nodelevelY>
</nodelevelX>
基于XSLT2.0的验证:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     <xsl:copy-of select=
     "/nodelevelX/nodelevelY/node2/key[text()='RED']
                    /following-sibling::*[1][self::value]
                            /substring(., string-length() -3)"/>
 </xsl:template>
</xsl:stylesheet>
1908

您能告诉我们XSLT中试图提取该值的部分吗?我不知道这是否重要,但所有元素中的文本都包装在CDATA中。(问题已更新)您可能会感兴趣的是,您接受的答案不正确。这是正确的,因为它适用于我的案例并正确地回答了我的问题。您能否向我们展示XSLT中试图提取此值的部分?我不知道这是否重要,但是所有元素中的文本都包装在CDATA中。(问题已更新)您可能会感兴趣的是,您接受的答案不正确。这是正确的,因为它适用于我的案例并正确回答了我的问题。这使得假设红色
键之后的下一个
元素是所寻求的
元素,我认为这是一个安全的假设。这使得假设红色
之后的下一个
元素是所寻求的
元素,我认为这是一个安全的假设。