对连接的祖先值进行Xpath搜索

时间:2011-12-09 09:39:08

标签: xml xpath

我有一个网站结构的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'],'/')]

任何提示都会很棒。

1 个答案:

答案 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>