如何使用cxml stp';s递归查找,如果

如何使用cxml stp';s递归查找,如果,xml,lisp,common-lisp,Xml,Lisp,Common Lisp,我找不到示例,也找不出这些函数的文档: 假设我想在Stack Overflow的首页找到第一个。我可以通过以下方式获取HTML树: (取消获取页面(url) “获取页面的STP(DOM替代)表示形式” (chtml:parse) (drakma:http请求url) (cxml stp:make builder))) (获取第页“http://stackoverflow.com") 但是,从这里开始,我不知道递归查找和递归查找是否与实际参数类似 编辑:在SO首页上查找第一个的解决方案,

我找不到示例,也找不出这些函数的文档:

假设我想在Stack Overflow的首页找到第一个
。我可以通过以下方式获取HTML树:

(取消获取页面(url)
“获取页面的STP(DOM替代)表示形式”
(chtml:parse)
(drakma:http请求url)
(cxml stp:make builder)))
(获取第页“http://stackoverflow.com")
但是,从这里开始,我不知道
递归查找
递归查找是否与实际参数类似

编辑:在SO首页上查找第一个
的解决方案,使用
递归查找if

(cxml stp:如果
(λ(节点)
(和(typep节点的cxml stp:element)
(相等(stp:本地名称节点)“div”)
(相等(stp:属性值节点“类”)“摘要”))
(获取第页“http://stackoverflow.com"))

这些函数遍历节点树,当您找到所需的节点(在
递归查找
的情况下)或满足谓词的节点(在
递归查找
的情况下)时返回。谓词可能应该对节点执行某些操作,但可以是任意的。例如,这里有一种返回第10个节点的方法(通过使用在第10次调用时返回true的谓词):

;;返回第10个节点
(let((x 0))
(cxml stp:如果
(λ(节点)
(=(增量x)10))
(获取第页“http://stackoverflow.com")))
作为一个更现实的示例,下面是如何检索具有本地名称的元素
“title”
(请注意,您只能在
元素上使用
本地名称
,而不能在任意
节点上使用,因此
:key
函数有点笨拙):

CL-USER>(cxml-stp:递归查找
“标题”
(获取第页“http://stackoverflow.com")
:键(lambda(节点)
(如果(类型节点的cxml stp:element)
(cxml stp:本地名称节点)
""))
:test'字符串相等)
;=>
;#.(CXML-STP:元件
#|:类型元素的父元素|#
;:子项(#)(CXML-STP:TEXT
#|:类型元素的父元素|#
;:数据“堆栈溢出”))
;:本地名称“标题”
;:名称空间-URI“http://www.w3.org/1999/xhtml")

这些函数遍历节点树,当您找到所需的节点(在
递归查找
的情况下)或满足谓词的节点(在
递归查找
的情况下)时返回。谓词可能应该对节点执行某些操作,但可以是任意的。例如,这里有一种返回第10个节点的方法(通过使用在第10次调用时返回true的谓词):

;;返回第10个节点
(let((x 0))
(cxml stp:如果
(λ(节点)
(=(增量x)10))
(获取第页“http://stackoverflow.com")))
作为一个更现实的示例,下面是如何检索具有本地名称的元素
“title”
(请注意,您只能在
元素上使用
本地名称
,而不能在任意
节点上使用,因此
:key
函数有点笨拙):

CL-USER>(cxml-stp:递归查找
“标题”
(获取第页“http://stackoverflow.com")
:键(lambda(节点)
(如果(类型节点的cxml stp:element)
(cxml stp:本地名称节点)
""))
:test'字符串相等)
;=>
;#.(CXML-STP:元件
#|:类型元素的父元素|#
;:子项(#)(CXML-STP:TEXT
#|:类型元素的父元素|#
;:数据“堆栈溢出”))
;:本地名称“标题”
;:名称空间-URI“http://www.w3.org/1999/xhtml")

您能举例说明您想做什么吗?看起来这些函数的工作方式与CL的
find
find if
的工作方式几乎相同
item
可以是一个节点,在这种情况下,您可以直接找到该节点,或者可以是一个数字,例如,
key
函数获取一个节点并返回一个数字,等等……您能给出一个您想做的示例吗?看起来这些函数的工作方式与CL的
find
find if
的工作方式几乎相同
item
可以是一个节点,在这种情况下,您可以直接找到该节点,或者如果
函数获取一个节点并返回一个数字,则可以是一个数字,等等。…