2016-03-07 40 views
0

所以我一直在努力计算不同的元素。我有这个数据。代码准备好复制粘贴。XSL 1.0 Count与“following:[element]”不同,并排除某些元素

<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> 

我想算不同的项目Id值,其中CgiBundleLines = 1的结果必须是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个返回count = 11,这正是我想要的。那么,如何排除最后3个元素,或者让我的XSL代码不能计算它们。

谢谢。

回答

1

如果您使用单独的谓词/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

+0

这解决它完美。我谢谢你。 – Lange