不允许将多个项目的序列作为 fn:substring() 的第一个参数

问题描述 投票:0回答:2

我在 xslt 中使用子字符串时收到此错误,错误消息很清楚,因此我尝试将多个序列值放入变量中并使用变量的子字符串,它也不起作用,同样的错误。有人可以为此提供解决方法吗?

输入:

<Path1>
                                    <Path2>SENDER 1</Path2>
                                    <Path2> SENDER xyc</Path2>
                                    <Path2> SENDER </Path2>
                                    <Path2> ORG ID:</Path2>
                                    <Path2> ORG:=</Path2>
                                    <Path2> ORG </Path2>
                                    <Path2> BNF </Path2>
                                    <Path2> BNF NAME:=A</Path2>
                                    <Path2> BNF ADDRESS</Path2>
                                    <Path2> BNF FI ID:=</Path2>
                                    <Path2> BNF FI:=</Path2>
                                    <Path2> REC FI:=</Path2>
                                    <Path2> REC ID:=</Path2>
                                    <Path2> OBI:=</Path2>
                                </Path1>

xslt:

                                            <xsl:element name="ID">
                                                <xsl:value-of select="substring(*:Path1/*:Path2,1,500)"/>
                                            </xsl:element>
                                </xsl:element>
java xml xslt xslt-2.0 bxslider
2个回答
0
投票

发生错误的原因是有多个 Path2 元素,并且您尝试直接对它们应用子字符串函数,该函数返回多个输出序列,因此,该函数失败,因为它需要单个字符串而不是多个字符串。

作为解决方法,您可以通过迭代每个 Path2 元素将子字符串单独应用于每个 Path2 元素。以下是您可以做到的方法:

    <xsl:element name="EB">
      <xsl:element name="ID">  
        <xsl:for-each select="*:Path1/*:Path2">
           <xsl:value-of select="substring(.,1,500)"/> 
        </xsl:for-each>
      </xsl:element>
    </xsl:element>

在此代码中,我使用了 for-each 循环来迭代每个 Path2 元素,然后分别将子字符串应用于每个元素。

请记住将 * 替换为适当的命名空间前缀。此外,如果您希望连接这些字符串而不是使用单独的值,您可以使用 concat 或 string-join 函数。

    <xsl:element name="EB">
      <xsl:element name="ID">  
        <xsl:value-of select="string-join(*:Path1/*:Path2, ', ')"/>
      </xsl:element>
    </xsl:element>

这将用逗号连接所有 Path2 值。然后您可以对连接的字符串应用子字符串函数。


0
投票

您需要选择单个 Path2,而不是序列,因此请确保使用位置谓词,例如

Path2[1]
或确保在单个
Path2
的上下文中使用子字符串,例如匹配
Path2

至于您的评论,听起来好像您想要例如XPath 3.1 中的

string-join(Path2) => substring(1, 500)
或 XPath 2 中的
substring(string-join(Path2, ''), 1, 500)

© www.soinside.com 2019 - 2024. All rights reserved.