gpt4 book ai didi

xml - 如何使用 XSLT 2.0 或 XPath 2.0 获取引用具有不同值的元素的 hrefs?

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

我有以下 XML 输入

<a href="h1" />
<a href="h2" />
<a href="h3" />

<b id="h1">E1</b>
<b id="h2">E1</b>
<b id="h3">E2</b>
<b id="h4">E3</b>
<b id="h5">E3</b>
<b id="h6">E4</b>
<b id="h7">E5</b>

有没有办法使用 XSLT2/Xpath2 只得到 h1 和 h3 指的是不同的值 E1 和 E2 而忽略 h2,因为它指的是相同的值 E1?

谢谢。

最佳答案

使用 ,假设 ab是顶级元素的 child :

   for $href in /*/a/@href,
$b in /*/b[@id = $href and not(. = preceding-sibling::b)]
return
string($href)

XSLT - 基于 2 的验证 :
<xsl:stylesheet version="2.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>

<xsl:template match="/">
<xsl:sequence select=
"for $href in /*/a/@href,
$b in /*/b[@id = $href and not(. = preceding-sibling::b)]
return
string($href)
"/>
</xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时:
<html>
<a href="h1" />
<a href="h2" />
<a href="h3" />
<b id="h1">E1</b>
<b id="h2">E1</b>
<b id="h3">E2</b>
</html>

计算 XPath 表达式并将计算结果复制到输出 :
h1 h3

更新 :

正如 Michael Kay 所指出的,上述解决方案是 O(N^2) 并且可能会很慢,如果有很多 b sibling 。

这是一个至少线性(或更快)的 XSLT 2.0 解决方案:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>

<xsl:key name="kReferrer" match="b" use="@id"/>

<xsl:template match="/*">
<xsl:for-each-group select="key('kReferrer', a/@href)" group-by=".">
<xsl:sequence select="string(@id)"/>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>

同样,当此转换应用于同一个 XML 文档(上图)时,会产生所需的正确结果 :
h1 h3

关于xml - 如何使用 XSLT 2.0 或 XPath 2.0 获取引用具有不同值的元素的 hrefs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12627083/

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