2016-03-07 48 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