不允许将多个项目的序列作为“ne”(“72686200”、“72686200”)的第一个操作数

A sequence of more than one item is not allowed as the first operand of 'ne' ("72686200", "72686200")

提问人:Rao E 提问时间:11/13/2023 最后编辑:Rao E 更新时间:11/14/2023 访问量:96

问:

我正在尝试将第 2 个字符串上的第 13 个值替换为第 1 个字符串上的值。

726862应替换为72686200。此值来自其他元素。有没有办法我可以用变量来做到这一点,并且当我们有多个字符串时应该替换。

我一直得到 - 不允许将多个项目的序列作为“ne”(“72686200”、“72686200”)的第一个操作数 ...做

XPath XSLT

评论

1赞 Martin Honnen 11/13/2023
例如,您期望什么样的价值 和?您的 XPath 选择似乎具有两个或多个序列,因为您同时选择了 tokenize 的结果和 中的常量字符串。CurrentRateClassPreviousRateClass/*:Transaction/*:Ratings/*:Rating[*:Premiums/*:Premium[*:Category/@*:SourceKey='PRP']/*:Amount !=0]/tokenize(@*:SourceKey,'\|')[13],'72686200'
1赞 michael.hor257k 11/13/2023
@RaoE请不要在评论中发布代码 - 编辑您的问题并提供重现问题的方法。
0赞 michael.hor257k 11/14/2023
这仍然不允许我们重现问题 - 请参阅最小可重现示例

答:

0赞 y.arazim 11/14/2023 #1

也许这个例子可以帮助你:

输入:

<root>
    <source>1|22|333|4444|55555|666666|7777777</source>   
    <target>A|BB|CCC|DDDD|EEEEE|FFFFFF|GGGGGGG</target>   
</root>

XSLT(2.0 版):

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="/root"> 
    <result> 
        <xsl:variable name="tgt" select="tokenize(target, '\|')" />
        <xsl:value-of select="$tgt[position() lt 5], tokenize(source, '\|')[5], $tgt[position() gt 5]" separator="|"/>
    </result> 
</xsl:template> 

</xsl:stylesheet>

结果:

<?xml version="1.0" encoding="UTF-8"?>
<result>A|BB|CCC|DDDD|55555|FFFFFF|GGGGGGG</result>

在这里,我们将第二个字符串的第 5 个标记替换为第一个字符串的第 5 个标记。

评论

1赞 y.arazim 11/14/2023
@RaoE 对不起,如果没有可重现的例子(包括您的输入),我无法进一步帮助您,正如其他人已经要求的那样。请停止在评论中发布代码(也已经要求)。
0赞 Michael Kay 11/14/2023 #2

查看您的代码:

<xsl:template name="CheckRateClassChange" match="*:template[@*:name='CheckRateClassChange']">
  <xsl:if test="$Activity/*:Transaction/...">
     <xsl:for-each select="$Activity/*:Transaction/...">
        <xsl:variable name="CurrentRateClass"
                      select="/*:Transaction/*:Ratings/..."/>
        <xsl:variable name="PreviousRateClass"
                      select="$LastSnapshot/*:Transaction/..."/>
        <xsl:if test="$CurrentRateClass ne $PreviousRateClass">

有经验的用户通常会在变量中添加“as”子句来声明其预期类型;这只会给你一个更早、更集中的解释,说明出了什么问题。

您没有提供任何理由来相信这些复杂的路径表达式中的任何一个都应该返回单个值,因此我们面前的证据表明它们不会返回。如果您认为他们应该返回单例,那么您需要向我们展示源文档来证明这种信念的合理性。

联机 XPath 可视化工具(如 Oxygen 中的可视化工具)可能有助于评估 XPath 表达式实际返回的内容。