gpt4 book ai didi

XPath 获取特定长度的文本

转载 作者:行者123 更新时间:2023-12-03 15:28:05 24 4
gpt4 key购买 nike

我正在尝试创建一个 XPath 查询,每次都会获得 549 个文本字符。文本应该是关于相关主题的,在下面的例子中是 orangesapplespears .如果页面上不存在包含这些词的元素,那么我希望 XPath 查询在页面上找到更容易定位/不太具体的文本。

所以为了澄清,我正在尝试创建一个 XPath 查询来查找包含特定类型文本的元素,如果使用下面的查询找到 549 个或更多字符,那么我们就完成了,如果没有找到或者返回的文本是少于 549 个字符,我希望 XPath 查询在页面上以段落形式获取任何文本(除了按钮、链接、菜单等中的文本外,任何文本都可以工作)并返回该文本的 549 个字符,如果结果是字符串少于 549 个字符我想将这两个查询与以下内容连接起来:...在中间。

   substring(normalize-space(//*[self::p or self::div][contains(text(),'apples') or contains(text(),'oranges') or contains(text(),'pears')]), 0, 549)

我一直在努力解决这个问题,我将不胜感激任何建议!

提前谢谢了!

最佳答案

是的。有一个string-length()您可以在谓词中使用的 xpath 中的函数:

substring(normalize-space(//*[string-length( text()) > 549 and (... other conditions ...)]),0,549)

请参阅“ Is there an "if -then - else " statement in XPath?”了解如何使用条件判断是否需要添加省略号。

改编上述 SO 问题中的示例:
if (fn:string-length(normalize-space(//*[self::p or self::div][contains(text(),'apples']) > 549)
then (concat( fn:substring(normalize-space(//*[self::p or self::div][contains(text(),'apples']), 0, 5490), "...") )
else (normalize-space(//*[self::p or self::div][contains(text(),'apples']))

在我看来,这在 XPath 中非常复杂。如果您可以使用 XQuery,您将拥有更易读的转换:
for $text in normalize-space(//*[self::p or self::div])
where $text[contains(text(),'apples' or ...]
return
if (string-length( $text) > 549) then
concat( substring( $text, 0, 549), "...")
else
$text

我怀疑这实际上可以通过多个和嵌套的 for 语句进一步优化(为了可读性、维护),以处理您需要的各种结果。

如果使用 XSL:
<xsl:template match="//*[self::p or self::div][contains(text(),'apples' or ...]">
<xsl:variable name="text" select="normalize-space( . )" />
<xsl:choose>
<xsl:when test="string-length( $text)">
<xsl:value-of select="substring( $text, 0, 549)"/>...
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

您也可以使用 matches() xpath 函数,避免有这么多 contains()谓词,通过构造正则表达式:
matches( //*[self::p or self::div][matches(text(),'(apples|oranges|bananas)'])

最后,请注意使用 //* XPath 中的效率非常低,如果您的文档有任何权重,您将看到性能影响。我很痒,告诉我有一种方法可以优化它,但不幸的是我没有时间研究。

关于XPath 获取特定长度的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17688190/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com