使用 XPath 获取元素的非重复计数

Get distinct count of an element using XPath

我需要获取某个特定元素的不同计数,但我必须只使用一个 XPath 行来满足该要求。

<root>
    <Custom1>
        <ZDPANR>PALLET1</ZDPANR>
    </Custom1>
    <Custom1>

        <ZDPANR>PALLET3</ZDPANR>
    </Custom1>
    <Custom1>

        <ZDPANR>PALLET1</ZDPANR>
    </Custom1>
    <Custom1>

        <ZDPANR>PALLET1</ZDPANR>
    </Custom1>
    <Custom1>

        <ZDPANR>PALLET2</ZDPANR>
    </Custom1>
    <Custom1>

        <ZDPANR>PALLET2</ZDPANR>
    </Custom1>
</root>

目前我尝试过的代码正在获取 <ZDPANR> 元素的不同值。

<xsl:for-each select="//ZDPANR[not(.=following::ZDPANR) and .!='']">
  <td>
    <xsl:value-of select="count(//ZDPANR[.=(.)])"/><!--Single Xpath line where the count is not coming proper-->
  </td>
</xsl:for-each>

我可以使用 for-each 中的 . 访问当前不同的 ZDPANR。但是 count(//ZDPANR[.=(.)]) (.) 没有得到当前的 ZDPANR。如果我像这样硬编码 count(//ZDPANR[.='PALLET2']) 它就正确了。因此,我想在那个硬编码的地方获得当前 ZDPANR 。 有人可以帮助我实现这一目标吗?由于工具限制,我只能使用 Xpath 1.0.

在不同 ZDPANR 元素的循环中设置一个变量,并在 count() XPath 谓词的谓词中访问它。

您的输入XML,

<root>
  <Custom1>
    <ZDPANR>PALLET1</ZDPANR>
  </Custom1>
  <Custom1>
    <ZDPANR>PALLET3</ZDPANR>
  </Custom1>
  <Custom1>
    <ZDPANR>PALLET1</ZDPANR>
  </Custom1>
  <Custom1>
    <ZDPANR>PALLET1</ZDPANR>
  </Custom1>
  <Custom1>
    <ZDPANR>PALLET2</ZDPANR>
  </Custom1>
  <Custom1>
    <ZDPANR>PALLET2</ZDPANR>
  </Custom1>
</root>

提供给这个更新的 XSLT,

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:template match="/">
    <table>
      <xsl:for-each select="//ZDPANR[not(.=following::ZDPANR) and .!='']">
        <xsl:variable name="cur" select="."/>
        <tr>
          <td><xsl:value-of select="$cur"/></td>
          <td><xsl:value-of select="count(//ZDPANR[.=$cur])"/></td>
        </tr>
      </xsl:for-each>
    </table>
  </xsl:template>
</xsl:stylesheet>

将产生此输出 XML,

<table>
   <tr>
      <td>PALLET3</td>
      <td>1</td>
   </tr>
   <tr>
      <td>PALLET1</td>
      <td>3</td>
   </tr>
   <tr>
      <td>PALLET2</td>
      <td>2</td>
   </tr>
</table>

根据要求。