统计两个节点之间特定节点的数量

问题描述 投票:0回答:2

我想计算 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

xslt xpath
2个回答
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
投票

您可以计算以下

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>
© www.soinside.com 2019 - 2024. All rights reserved.