我有一个网站结构的XML文件,并希望根据该节点及其父节点的连接值搜索节点。
以下是XML示例:
<site>
<page id="1">
<url></url>
<url>home</url>
<page id="2">
<url>about-us</url>
</page>
<page id="3">
<url>locations</url>
<page id="4">
<url>scotland</url>
<page id="5">
<url>glasgow</url>
</page>
<page id="6">
<url>edinburgh</url>
</page>
</page>
</page>
</page>
</site>
因此,如果网址为/locations/scotland/edinburgh
,我想要选择页面id=6
。
我希望XPath查询可能属于......的范畴。
//page[fn:string-join(ancestor-or-self::page[
url='locations/scotland/edinburgh'],'/')]
任何提示都会很棒。
答案 0 :(得分:1)
首先需要将URL拆分为路径组成部分(可以使用XPath 2.0轻松完成,但在XPath 1.0中完全没有),然后构建并评估此XPath表达式:
//page[url='locations']
/page[url='scotland']
/page[url='edinburgh']
/@id
这会选择所需的id
属性。
此id
属性(6)的字符串值是评估以下XPath表达式的结果:
string(//page[url='locations']
/page[url='scotland']
/page[url='edinburgh']
/@id
)
<强>更新强>:
存在一个通用的XPath 2.0表达式,它给出了一个名为$pUrl
的参数,其中包含Url,找到所有需要属性的page
元素:
//page
[ends-with(
concat('/',
string-join(ancestor-or-self::*/url, '/')
),
$pUrl
)
]
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:param name="pUrl" select="'/locations/scotland/edinburgh'"/>
<xsl:template match="/">
<xsl:sequence select=
"//page
[ends-with(
concat('/',
string-join(ancestor-or-self::*/url, '/')
),
$pUrl
)
]
"/>
</xsl:template>
</xsl:stylesheet>
**when this transformation is applied on the provided XML document**:
<site>
<page id="1">
<url></url>
<url>home</url>
<page id="2">
<url>about-us</url>
</page>
<page id="3">
<url>locations</url>
<page id="4">
<url>scotland</url>
<page id="5">
<url>glasgow</url>
</page>
<page id="6">
<url>edinburgh</url>
</page>
</page>
</page>
</page>
</site>
选择了正确的page
元素并输出:
<page id="6">
<url>edinburgh</url>
</page>