如何用XPath/XQuery实现类似Python的字符串整数乘法功能?
好问题!这种字符串重复的需求在XPath/XQuery里确实不像Python那样有极简的语法,但其实有几种更优雅的实现方式,完全不用手动构造超长字符串再截断,更可靠也更简洁。
1. XQuery 3.0+ 或 XPath 3.0+:直接用fn:repeat函数
如果你的环境支持XQuery 3.0及以上(或者XPath 3.0+),那最直接的方案就是使用**fn:repeat**内置函数,它完全对应你想要的Python风格写法:
fn:repeat("XO", count(something))
这个函数接受两个参数:第一个是要重复的字符串,第二个是重复的次数。比如count(something)返回3的话,就会直接返回XOXOXO;单字符重复比如fn:repeat("X", 3)会返回XXX,和Python的写法几乎一致。
2. XPath 2.0+ / XQuery 1.0+:用循环+字符串拼接
如果你的环境只支持到XPath 2.0或XQuery 1.0(没有fn:repeat),可以用for循环生成重复的字符串序列,再用string-join拼接成最终字符串:
string-join(for $i in 1 to count(something) return "XO", "")
原理很简单:循环生成count(something)个"XO"的字符串序列,然后用空字符串作为分隔符把它们连接起来,最终得到重复N次的结果。这种方式不需要预估长度,完全由count(something)的结果决定,比你之前的截断方法灵活得多。
3. XPath 1.0(旧环境兼容方案)
如果不幸还在使用不支持循环的XPath 1.0,那只能借助递归模板(通常在XSLT场景下)来实现。比如定义一个递归模板:
<xsl:template name="repeat-string"> <xsl:param name="target-str" /> <xsl:param name="repeat-times" /> <xsl:if test="$repeat-times > 0"> <xsl:value-of select="$target-str" /> <xsl:call-template name="repeat-string"> <xsl:with-param name="target-str" select="$target-str" /> <xsl:with-param name="repeat-times" select="$repeat-times - 1" /> </xsl:call-template> </xsl:if> </xsl:template>
调用时传入目标字符串和重复次数:
<xsl:call-template name="repeat-string"> <xsl:with-param name="target-str" select="'XO'" /> <xsl:with-param name="repeat-times" select="count(something)" /> </xsl:call-template>
这种方式虽然不如高版本简洁,但能在旧环境下满足需求。
对比你之前的截断方法,上面这些方案都不需要提前预估count()的最大值,完全动态适配结果,代码可读性和维护性也更好。
内容的提问来源于stack exchange,提问作者Jack Fleeting

