2011-07-30 67 views
3

我有XML文件,其中有一定數量有時等於0的記錄集。 現在我必須擺脫這些記錄集。我做了以下。是否否定條件?

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0"> 

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<!-- delete 0-quantity records --> 
<xsl:template match="/ExportData/DataSet/Tables/Table/Rows/R[productQuantityinttrue='0']"/> 

</xsl:stylesheet> 

它基本上工作:它複製除了productQuantityinttrue = 0之外的所有東西。但有時會刪除不應該刪除的記錄集。 現在我的問題是,是否有更好的協商工作像

<xsl:template match="/ExportData/DataSet/Tables/Table/Rows/R[not(productQuantityinttrue='0')]" 

然後當然我會複製這些針對這最後的說法是正確的。 有沒有人有過這方面的經驗?我沒有發佈XML,因爲它基本上是關於「否定或不否定」。

感謝您的想法和問候, 彼得

<?xml version="1.0" encoding="UTF-8"?> 
<ExportData> 
    <TransportHeader> 
    <Timestamp>2011-07-28 14:16:49</Timestamp> 
    <From> 
     <Name>MFES DynamicExport Plugin</Name> 
     <Version>1.1.6.95</Version> 
    </From> 
    <MessageId>a46d4d6d-667e-4e74-b3c5-a6e9ecaeacb1</MessageId> 
    </TransportHeader> 
    <ExportConfig> 
    <DateTimeFormat>yyyy-MM-dd HH:mm:ss</DateTimeFormat> 
    <DecimalSymbol>.</DecimalSymbol> 
    </ExportConfig> 
    <DataSet>LSA_SALES_EXPORT <Tables> 
    <Table>MI_Sales <RH> 
     <C>companyCodestringtrue</C> 
     <C>storeNumstring</C> 
     <C>transactionDatedateTime</C> 
     <C>transactionQualifierIDint</C> 
     <C>transactionQualifierstring</C> 
     <C>costCenterNumberstringtrue</C> 
     <C>revenueCenterPOSReflongtrue</C> 
     <C>menuItemNumberlong</C> 
     <C>menuItemNameOnestring</C> 
     <C>menuItemNameTwostringtrue</C> 
     <C>crossReferenceOnestringtrue</C> 
     <C>crossReferenceTwostringtrue</C> 
     <C>consumerUnitDescriptionstringtrue</C> 
     <C>transactionValueInclVATdecimaltrue</C> 
     <C>transactionValueExclVATdecimaltrue</C> 
     <C>productQuantityinttrue</C> 
     <C>productValueInclVATdecimaltrue</C> 
     <C>productValueExclVATdecimaltrue</C> 
     <C>discountType01AmountInclVATdecimaltrue</C> 
     <C>discountType02AmountInclVATdecimaltrue</C> 
     <C>discountType03AmountInclVATdecimaltrue</C> 
     <C>discountType04AmountInclVATdecimaltrue</C> 
     <C>discountType05AmountInclVATdecimaltrue</C> 
     <C>discountType06AmountInclVATdecimaltrue</C> 
     <C>discountType07AmountInclVATdecimaltrue</C> 
     <C>discountType08AmountInclVATdecimaltrue</C> 
     <C>discountType09AmountInclVATdecimaltrue</C> 
     <C>discountType10AmountInclVATdecimaltrue</C> 
     <C>discountType01AmountExclVATdecimaltrue</C> 
     <C>discountType02AmountExclVATdecimaltrue</C> 
     <C>discountType03AmountExclVATdecimaltrue</C> 
     <C>discountType04AmountExclVATdecimaltrue</C> 
     <C>discountType05AmountExclVATdecimaltrue</C> 
     <C>discountType06AmountExclVATdecimaltrue</C> 
     <C>discountType07AmountExclVATdecimaltrue</C> 
     <C>discountType08AmountExclVATdecimaltrue</C> 
     <C>discountType09AmountExclVATdecimaltrue</C> 
     <C>discountType10AmountExclVATdecimaltrue</C> 
     <C>totalAmountDiscountInclVATdecimaltrue</C> 
     <C>totalAmountDiscountExclVATdecimaltrue</C> 
     <C>totalAmountVATdecimaltrue</C> 
     <C>rateAmountVATdecimaltrue</C> 
     <C>returnReasonCodestringtrue</C> 
     <C>weightdecimaltrue</C> 
     <C>detailTypeinttrue</C> 
     <C>detailPOSReflong</C> 
     <C>menuItemIDlong</C> 
    </RH> 
    <Rows> 
     <R> 
     <companyCodestringtrue>111</companyCodestringtrue> 
     <storeNumstring>6002</storeNumstring> 
     <transactionDatedateTime>2011-07-27 00:00:00</transactionDatedateTime> 
     <transactionQualifierIDint>1</transactionQualifierIDint> 
     <transactionQualifierstring>Sales</transactionQualifierstring> 
     <costCenterNumberstringtrue/> 
     <revenueCenterPOSReflongtrue>1000</revenueCenterPOSReflongtrue> 
     <menuItemNumberlong>5900003</menuItemNumberlong> 
     <menuItemNameOnestring>Exc X Crmy 100g.LSCA</menuItemNameOnestring> 
     <menuItemNameTwostringtrue>Exc X Crmy 1.LSCA</menuItemNameTwostringtrue> 
     <crossReferenceOnestringtrue>1110</crossReferenceOnestringtrue> 
     <crossReferenceTwostringtrue>037466017594</crossReferenceTwostringtrue> 
     <consumerUnitDescriptionstringtrue/> 
     <transactionValueInclVATdecimaltrue>3.69</transactionValueInclVATdecimaltrue> 
     <transactionValueExclVATdecimaltrue>3.69</transactionValueExclVATdecimaltrue> 
     <productQuantityinttrue>1</productQuantityinttrue> 
     <productValueInclVATdecimaltrue>3.69</productValueInclVATdecimaltrue> 
     <productValueExclVATdecimaltrue>3.265487</productValueExclVATdecimaltrue> 
     <discountType01AmountInclVATdecimaltrue/> 
     <discountType02AmountInclVATdecimaltrue/> 
     <discountType03AmountInclVATdecimaltrue/> 
     <discountType04AmountInclVATdecimaltrue/> 
     <discountType05AmountInclVATdecimaltrue/> 
     <discountType06AmountInclVATdecimaltrue/> 
     <discountType07AmountInclVATdecimaltrue/> 
     <discountType08AmountInclVATdecimaltrue/> 
     <discountType09AmountInclVATdecimaltrue/> 
     <discountType10AmountInclVATdecimaltrue/> 
     <discountType01AmountExclVATdecimaltrue/> 
     <discountType02AmountExclVATdecimaltrue/> 
     <discountType03AmountExclVATdecimaltrue/> 
     <discountType04AmountExclVATdecimaltrue/> 
     <discountType05AmountExclVATdecimaltrue/> 
     <discountType06AmountExclVATdecimaltrue/> 
     <discountType07AmountExclVATdecimaltrue/> 
     <discountType08AmountExclVATdecimaltrue/> 
     <discountType09AmountExclVATdecimaltrue/> 
     <discountType10AmountExclVATdecimaltrue/> 
     <totalAmountDiscountInclVATdecimaltrue/> 
     <totalAmountDiscountExclVATdecimaltrue/> 
     <totalAmountVATdecimaltrue>0</totalAmountVATdecimaltrue> 
     <rateAmountVATdecimaltrue>13</rateAmountVATdecimaltrue> 
     <returnReasonCodestringtrue/> 
     <weightdecimaltrue>0</weightdecimaltrue> 
     <detailTypeinttrue>1</detailTypeinttrue> 
     <detailPOSReflong>5900003</detailPOSReflong> 
     <menuItemIDlong>136577483</menuItemIDlong> 
     </R> 
     <R> 
     <companyCodestringtrue>111</companyCodestringtrue> 
     <storeNumstring>6002</storeNumstring> 
     <transactionDatedateTime>2011-07-27 00:00:00</transactionDatedateTime> 
     <transactionQualifierIDint>1</transactionQualifierIDint> 
     <transactionQualifierstring>Sales</transactionQualifierstring> 
     <costCenterNumberstringtrue/> 
     <revenueCenterPOSReflongtrue>1000</revenueCenterPOSReflongtrue> 
     <menuItemNumberlong>5900185</menuItemNumberlong> 
     <menuItemNameOnestring>PD MousseHzl140g.LSCA</menuItemNameOnestring> 
     <menuItemNameTwostringtrue>PD MousseHzl.LSCA</menuItemNameTwostringtrue> 
     <crossReferenceOnestringtrue>428131</crossReferenceOnestringtrue> 
     <crossReferenceTwostringtrue>037466083414</crossReferenceTwostringtrue> 
     <consumerUnitDescriptionstringtrue/> 
     <transactionValueInclVATdecimaltrue>0</transactionValueInclVATdecimaltrue> 
     <transactionValueExclVATdecimaltrue>0</transactionValueExclVATdecimaltrue> 
     <productQuantityinttrue>0</productQuantityinttrue> 
     <productValueInclVATdecimaltrue>4.99</productValueInclVATdecimaltrue> 
     <productValueExclVATdecimaltrue>4.415929</productValueExclVATdecimaltrue> 
     <discountType01AmountInclVATdecimaltrue/> 
     <discountType02AmountInclVATdecimaltrue/> 
     <discountType03AmountInclVATdecimaltrue/> 
     <discountType04AmountInclVATdecimaltrue/> 
     <discountType05AmountInclVATdecimaltrue/> 
     <discountType06AmountInclVATdecimaltrue/> 
     <discountType07AmountInclVATdecimaltrue/> 
     <discountType08AmountInclVATdecimaltrue/> 
     <discountType09AmountInclVATdecimaltrue/> 
     <discountType10AmountInclVATdecimaltrue/> 
     <discountType01AmountExclVATdecimaltrue/> 
     <discountType02AmountExclVATdecimaltrue/> 
     <discountType03AmountExclVATdecimaltrue/> 
     <discountType04AmountExclVATdecimaltrue/> 
     <discountType05AmountExclVATdecimaltrue/> 
     <discountType06AmountExclVATdecimaltrue/> 
     <discountType07AmountExclVATdecimaltrue/> 
     <discountType08AmountExclVATdecimaltrue/> 
     <discountType09AmountExclVATdecimaltrue/> 
     <discountType10AmountExclVATdecimaltrue/> 
     <totalAmountDiscountInclVATdecimaltrue/> 
     <totalAmountDiscountExclVATdecimaltrue/> 
     <totalAmountVATdecimaltrue>0</totalAmountVATdecimaltrue> 
     <rateAmountVATdecimaltrue>13</rateAmountVATdecimaltrue> 
     <returnReasonCodestringtrue/> 
     <weightdecimaltrue>0</weightdecimaltrue> 
     <detailTypeinttrue>1</detailTypeinttrue> 
     <detailPOSReflong>5900185</detailPOSReflong> 
     <menuItemIDlong>136577665</menuItemIDlong> 
     </R> 
    </Rows> 
    </Table> 
</Tables> 

+0

好問題,+1。請參閱我的回答,以瞭解造成問題的原因(總是提供足夠的數據來重現問題!)併爲此提供解決方案。 –

回答

3
<!-- delete 0-quantity records --> 

<xsl:template match="/ExportData/DataSet/Tables/Table/Rows/R[productQuantityinttrue='0']"/> 

它的基本工作原理:它會將一切,除了與 productQuantityinttrue = 0的人。但有時候有刪除的記錄集 不應該。

您還沒有提供過這個問題的示例

我的猜測是,您可以通過使用解決這個問題:

<xsl:template match= 
    "Rows/R[not(productQuantityinttrue[2]) 
     and 
      productQuantityinttrue='0' 
      ]"/> 

match屬性的表達式會選擇只有一個productQuantityinttrue孩子的字符串值只有這樣.../Rows/R元素這隻productQuantityinttrue小孩是'0'

+0

你好Dimitre,謝謝你的回答。我現在提供了一個具有2個記錄集的示例。當然實際上它是50和更多集合。我認爲這也是我所用的漫長道路可能導致的問題。我不明白你的問題是「productQuantityinttrue [2]」。如果每個記錄集真的只有一個「productQuantityinttrue」,我需要嗎? – Peter

+0

@彼得:感謝您提供一個例子。然而,這個例子並沒有說明你的陳述,「有時候有不應該被刪除的記錄集」。你需要展示一個例子,在這裏發生這種不需要的刪除操作。另外,你需要解釋*爲什麼刪除的元素不應該被刪除。這對於修改空(刪除)模板的匹配模式是必要的,以便它匹配和刪除所需要的元素。 –

+0

每當「productQuantityinttrue」不是「0」時,不應該刪除它。所以只有0個必須被刪除。我無法提供一個不需要的刪除的例子,因爲本地(使用Oxygen)輸出總是可以的。只有在服務器上運行時,它有時會發生。我肯定會縮短到「Rows/R ...」的路徑,就像您在示例中所做的一樣,並檢查productQuantityinttrue ='0'並查看它是否再次發生。再次感謝你的努力,彼得 – Peter