XSL 1.0 Count Distinct with "following:[element]" 并排除某些元素
XSL 1.0 Count Distinct with "following:[element]" and exclude certain elements
所以我一直在努力计算不同的元素。我有这个数据。代码已准备好复制粘贴。
<CustInvoiceTable class="entity">
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000088</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000088</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000091</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000091</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000098</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000098</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000086</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000086</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000062</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>2</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000062</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>2</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000111</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000111</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000089</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000089</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000092</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000092</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000101</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000101</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000102</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000102</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000083</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000083</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000067</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000067</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000125</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>0</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000069</ItemId>
</McsCmBilCalcInvoiceLine>
<!-- Excluding these 3 elements will result in the correct count -->
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000083</ItemId>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000092</ItemId>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000098</ItemId>
</McsCmBilCalcInvoiceLine>
</CustInvoiceTable>
我想计算 CgiBundleLines = 1 的不同 ItemId 值。结果必须是 11。我的 XSL:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="Lines-by-ItemId" match="CustInvoiceTable/McsCmBilCalcInvoiceLine" use="CustInvoiceTable/McsCmBilCalcInvoiceLine/ItemId" />
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<CountOne><xsl:value-of select="count(CustInvoiceTable/McsCmBilCalcInvoiceLine[not(ItemId = following::ItemId) and McsCmBilProductItem/CgiBundleLines = 1])"/></CountOne>
<CountOne><xsl:value-of select="count(CustInvoiceTable/McsCmBilCalcInvoiceLine[not(ItemId = following::ItemId) and McsCmBilProductItem/CgiBundleLines = 1 and boolean(McsCmBilProductItem) = 1])"/></CountOne>
</xsl:template>
</xsl:stylesheet>
当我 运行 这时,我得到 8 的计数。看起来最后 3 个 McsCmBilCalcInvoiceLine 元素导致 ItemId 不被计算在内。计算这 3 returns 个计数 = 11,这就是我想要的。那么如何排除最后 3 个元素或使我的 XSL 代码不计算它们。
谢谢。
如果您使用单独的谓词 /CustInvoiceTable/McsCmBilCalcInvoiceLine[McsCmBilProductItem/CgiBundleLines = 1][not(ItemId = preceding-sibling::McsCmBilCalcInvoiceLine/ItemId)]
,那么您只能计算那些具有 McsCmBilProductItem/CgiBundleLines = 1
条件的元素。
所以
count(/CustInvoiceTable/McsCmBilCalcInvoiceLine[McsCmBilProductItem/CgiBundleLines = 1][not(ItemId = preceding-sibling::McsCmBilCalcInvoiceLine/ItemId)])
给出 11。
所以我一直在努力计算不同的元素。我有这个数据。代码已准备好复制粘贴。
<CustInvoiceTable class="entity">
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000088</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000088</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000091</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000091</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000098</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000098</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000086</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000086</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000062</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>2</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000062</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>2</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000111</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000111</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000089</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000089</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000092</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000092</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000101</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000101</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000102</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000102</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000083</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000083</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000067</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000067</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>1</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000125</ItemId>
<McsCmBilProductItem class="entity">
<CgiBundleLines>0</CgiBundleLines>
</McsCmBilProductItem>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000069</ItemId>
</McsCmBilCalcInvoiceLine>
<!-- Excluding these 3 elements will result in the correct count -->
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000083</ItemId>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000092</ItemId>
</McsCmBilCalcInvoiceLine>
<McsCmBilCalcInvoiceLine class="entity">
<ItemId>ITM-0000098</ItemId>
</McsCmBilCalcInvoiceLine>
</CustInvoiceTable>
我想计算 CgiBundleLines = 1 的不同 ItemId 值。结果必须是 11。我的 XSL:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="Lines-by-ItemId" match="CustInvoiceTable/McsCmBilCalcInvoiceLine" use="CustInvoiceTable/McsCmBilCalcInvoiceLine/ItemId" />
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<CountOne><xsl:value-of select="count(CustInvoiceTable/McsCmBilCalcInvoiceLine[not(ItemId = following::ItemId) and McsCmBilProductItem/CgiBundleLines = 1])"/></CountOne>
<CountOne><xsl:value-of select="count(CustInvoiceTable/McsCmBilCalcInvoiceLine[not(ItemId = following::ItemId) and McsCmBilProductItem/CgiBundleLines = 1 and boolean(McsCmBilProductItem) = 1])"/></CountOne>
</xsl:template>
</xsl:stylesheet>
当我 运行 这时,我得到 8 的计数。看起来最后 3 个 McsCmBilCalcInvoiceLine 元素导致 ItemId 不被计算在内。计算这 3 returns 个计数 = 11,这就是我想要的。那么如何排除最后 3 个元素或使我的 XSL 代码不计算它们。
谢谢。
如果您使用单独的谓词 /CustInvoiceTable/McsCmBilCalcInvoiceLine[McsCmBilProductItem/CgiBundleLines = 1][not(ItemId = preceding-sibling::McsCmBilCalcInvoiceLine/ItemId)]
,那么您只能计算那些具有 McsCmBilProductItem/CgiBundleLines = 1
条件的元素。
所以
count(/CustInvoiceTable/McsCmBilCalcInvoiceLine[McsCmBilProductItem/CgiBundleLines = 1][not(ItemId = preceding-sibling::McsCmBilCalcInvoiceLine/ItemId)])
给出 11。