使用 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>
根据要求。
我需要获取某个特定元素的不同计数,但我必须只使用一个 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>
根据要求。