计算两个节点之间的特定节点数

时间:2016-02-04 14:03:52

标签: xslt xpath

我想计算XML中两个节点之间存在的节点。下面是演示XML。

<?xml version="1.0" encoding="UTF-8"?>
<body>
  <a></a>
  <b></b>
  <b></b>
  <b></b>
  <a></a>
  <b></b>
  <a></a>
  <a></a>
  <b></b>
  <b></b>
  <a></a>
</body>

我正在使用下面的XSLT。

  <xsl:template match="a">
    <xsl:text>Number of B </xsl:text>
        <xsl:value-of select="count(preceding::a[1]/following::b)"/>
    </xsl:template>

我当前的输出。

 <body>
      Number of B 0
      <b></b>
      <b></b>
      <b></b>
      Number of B 6
      <b></b>
      Number of B 3
      Number of B 2
      <b></b>
      <b></b>
      Number of B 2

   </body>

但我的预期输出如下。

   <body>
      Number of B 0
      <b></b>
      <b></b>
      <b></b>
      Number of B 3
      <b></b>
      Number of B 1
      Number of B 0
      <b></b>
      <b></b>
      Number of B 2

   </body>

基本上我想在a之间计算。

请让我知道如何完成这项工作。

这是工作示例

http://xsltransform.net/6r5Gh3F

由于

2 个答案:

答案 0 :(得分:2)

您可以做的是创建一个将b元素链接到第一个a元素的键

<xsl:key name="b" match="b" use="generate-id(following-sibling::a[1])" />

然后您可以计算当前b元素之前的a元素,如下所示:

<xsl:value-of select="count(key('b', generate-id()))"/>

试试这个XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" />

    <xsl:key name="b" match="b" use="generate-id(following-sibling::a[1])" />

    <xsl:template match="a">
        <xsl:text>Number of B </xsl:text>
        <xsl:value-of select="count(key('b', generate-id()))"/>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:1)

您可以计算以下b的数量,并在以下b之后减去a的数量:

<xsl:template match="a">
  <xsl:text>Number of B </xsl:text>
  <xsl:value-of select="count(following::b) - count(following::a/following::b)"/>
</xsl:template>