gpt4 book ai didi

xml - XPATH 或 XSL 使用自定义比较来匹配两个节点集

转载 作者:数据小太阳 更新时间:2023-10-29 02:38:17 25 4
gpt4 key购买 nike

编辑:我也可以访问 ESXLT功能。

我有两个字符串标记节点集。一组包含如下值:

/Geography/North America/California/San Francisco
/Geography/Asia/Japan/Tokyo/Shinjuku

另一组包含如下值:

/Geography/North America/
/Geography/Asia/Japan/

我的目标是找到两者之间的“匹配”。当第 1 组中的任何字符串以第 2 组中的字符串开头时进行匹配。例如,将在 /Geography/North America/California/San Francisco/Geography 之间进行匹配/北美/ 因为第 1 组中的字符串以第 2 组中的字符串开头。

我可以通过使用第三方扩展来比较使用通配符的字符串。我还可以在 Xpath 中全部使用正则表达式。

我的问题是如何构建 Xpath 以使用两组所有节点之间的函数进行选择? XSL 也是一个可行的选择。

这个 XPATH:

count($set1[.=$set2])

会产生 set1 和 set2 之间的交集计数,但这是一对一的比较。是否可以使用其他方式比较节点?

编辑:我确实成功了,但我通过使用其他一些第三方扩展来作弊来获得相同的结果。我仍然对其他方法感兴趣。

最佳答案

这个:

<xsl:variable name="matches" select="$set1[starts-with(., $set2)]"/>

$matches 设置为包含 $set1 中每个节点的节点集,其文本值以 $set2 中节点的文本值开头。这就是您要找的,对吧?

编辑:

好吧,我只是错了。原因如下。

starts-with 期望它的两个参数都是字符串。如果不是,它将在评估函数之前将它们转换为字符串。

如果你给它一个节点集作为它的参数之一,它使用节点集的字符串值,这是集合中第一个节点的文本值。所以在上面,$set2 永远不会被搜索;只有列表中的第一个节点会被检查,因此谓词只会在 $set1 中找到以 $set2 中第一个节点的值开头的节点。

我被误导了,因为这个模式(我最近几天一直在使用它)确实有效:

<xsl:variable name="hits" select="$set1[. = $set2]"/>

但该谓词使用的是节点集之间的比较,而不是文本值之间的比较。

实现此目的的理想方法是嵌套谓词。也就是说,“我想找到 $set1 中的每个节点,$set2 中有一个节点的值以...开头”,这就是 XPath 崩溃的地方。从什么开始?你想写的是这样的:

<xsl:variable name="matches" select="$set1[$set2[starts-with(?, .)]]"/>

只是没有可以为 ? 编写的表达式,它会返回当前由外部谓词测试的节点。 (除非我遗漏了一些非常明显的东西。)

要得到你想要的,你必须单独测试每个节点:

<xsl:variable name="matches">
<xsl:for-each select="$set1">
<xsl:if test="$set2[starts-with(current(), .)]">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>
</xsl:variable>

这不是一个非常令人满意的解决方案,因为它的计算结果是一个结果树片段,而不是一个节点集。如果要在 XPath 表达式中使用变量,则必须使用扩展函数(如 msxsl:node-set)将 RTF 转换为节点集。

关于xml - XPATH 或 XSL 使用自定义比较来匹配两个节点集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/269989/

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