11

如何使用 xpath 获取完整文档中父节点的位置?

说我有以下xml:

<catalog>
  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
  </cd>
  <cd>
    <title>Hide your heart</title>
    <artist>Bonnie Tyler</artist>
    <country>UK</country>
    <company>CBS Records</company>
    <price>9.90</price>
    <year>1988</year>
  </cd>
</catalog>

我有一个 XSLT 将其转换为 HTML,如下所示(仅片段):

<xsl:template match="/">
<html>
  <body>  
  <xsl:apply-templates/>  
  </body>
  </html>
</xsl:template>

<xsl:template match="cd">
  <p>
    <xsl:number format="1. "/><br/>
    <xsl:apply-templates select="title"/>  
    <xsl:apply-templates select="artist"/>
  </p>
</xsl:template>

<xsl:template match="title">
  <xsl:number format="1" select="????" /><br/>
  Title: <span style="color:#ff0000">
  <xsl:value-of select="."/></span>
  <br />
</xsl:template>

我应该在 ???? 的地方写什么 获取文档中父 cd 标签的位置。我尝试了很多表达方式,但似乎没有任何效果。可能是我做错了。

  1. <xsl:number format="1" select="catalog/cd/preceding-sibling::..[position()]" />
  2. <xsl:number format="1" select="./parent::..[position()]" /><br/>
  3. <xsl:value-of select="count(cd/preceding-sibling::*)+1" /><br/>

我将 2nd 解释为选择当前节点的父轴,然后告诉当前节点的父级位置。为什么它不起作用?这样做的正确方法是什么。

仅供参考:我希望代码打印当前标题标签处理的父 cd 标签的位置。

请有人告诉我该怎么做。

4

3 回答 3

22
count(../preceding-sibling::cd) + 1

你可以在这里运行它(注意我删除了你输出的另一个数字,只是为了清楚起见)。

您是在正确的路线上,但请记住谓词仅用于过滤节点,而不是返回信息。所以:

../*[position()]

...实际上是说“找到我有职位的父母”。它返回节点,而不是位置本身。谓词只是一个过滤器。

在任何情况下 using 都有缺陷position(),它只能用于返回当前上下文节点的位置,而不是另一个节点。

于 2012-06-30T09:40:12.250 回答
4

Utkanos 的回答很好,但我的经验是,当 xml 文档很大时,这可能会导致性能问题。

在这种情况下,您可以简单地在参数中传递父级的位置。

<xsl:template match="/">
<html>
  <body>  
  <xsl:apply-templates/>  
  </body>
  </html>
</xsl:template>

<xsl:template match="cd">
  <p>
    <xsl:number format="1. "/><br/>
    <xsl:apply-templates select="title">  
        <xsl:with-param name="parent_position" select="position()"/> <!-- Send here -->
    </xsl:apply-templates>
    <xsl:apply-templates select="artist"/>
  </p>
</xsl:template>

<xsl:template match="title">
  <xsl:param name="parent_position"/> <!-- Receive here -->
  <xsl:number format="1" select="$parent_position"/><br/>
  Title: <span style="color:#ff0000">
  <xsl:value-of select="."/></span>
  <br />
</xsl:template>

结果:

<html xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><body>
  <p>1. <br>1<br>
  Title: <span style="color:#ff0000">Empire Burlesque</span><br>Bob Dylan</p>
  <p>2. <br>1<br>
  Title: <span style="color:#ff0000">Hide your heart</span><br>Bonnie Tyler</p>
</body></html>
于 2015-05-16T19:38:47.407 回答
1
  <xsl:number format="1" select="????" /> 

我应该在 ???? 的地方写什么 获取文档中父 cd 标签的位置。

首先,上面的 XSLT 指令在语法上是非法的——该<xsl:number>指令没有(不能)有一个select属性

使用

   <xsl:number format="1" count="cd" /> 
于 2012-06-30T15:57:48.960 回答