2014-06-17 22 views
1

我是新手XSLT開發人員。我被要求解決一個原始開發人員不在我們這個項目的問題。在XSLT,有一個for-each循環使用keycountXSLT:for-each循環,鍵不返回所有節點

<xsl:for-each select="ns0:BOM[count(. | key('subsat', ns0:BomText01)[1]) = 1][ns0:BomText01]"> 
    ... 

這是key

<xsl:key name="subsat" match="ns0:Parts/ns0:BOM[ns0:FindNum!='0']" use="ns0:BomText01" /> 

在XML文件中被轉化,也有表示子2個兄弟節點部件:

<ns0:BOM referentId="10000:65091335:65359080"> 
    <ns0:BomText01>3069260-303-SUB0027</ns0:BomText01> 
    <ns0:ItemNumber>My_part_1</ns0:ItemNumber> 
    <ns0:ItemType>Part</ns0:ItemType> 
    <ns0:Qty>67</ns0:Qty> 
</ns0:BOM> 
<ns0:BOM referentId="10000:65102551:86713230"> 
    <ns0:BomText01>3069260-303-SUB0027</ns0:BomText01> 
    <ns0:ItemNumber>My_part_2</ns0:ItemNumber> 
    <ns0:ItemType>Part</ns0:ItemType> 
    <ns0:Qty>67</ns0:Qty> 
</ns0:BOM> 

但是,該環路僅拾取第一個節點(My_part_1)。我懷疑這是因爲count=1,但我真的不知道。我不知道如何修改它。想法?如果我需要包含更多數據,請告訴我。

+0

請包括您的XML源代碼(父元素,名稱空間聲明等)的全部上下文以及XSLT文檔的所有相關模板(包括根節點,密鑰聲明,上面的每個模板和其中的模板,和任何其他模板被稱爲) – helderdarocha

+0

@Helderdarocha ...我希望我可以但它是專有內容。可能需要幾個小時才能完成它,並使其具有通用性。你有什麼建議如何計數的工作在foreach? – MikeTWebb

+0

好的。我會看看。你的'鑰匙'似乎也是無效的。它必須是有效的*限定名稱* - 它不會以數字開頭。你能夠運行它嗎?你在用什麼處理器? – helderdarocha

回答

1

假設你的XSLT的相關部分看起來是這樣的:

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

    <xsl:key name="subsat" match="ns0:BOM[ns0:FindNum!='0']" use="ns0:BomText01"/> 

    <xsl:template match="ns0:Parts"> 
     <xsl:for-each 
      select="ns0:BOM[count(. | key('subsat', ns0:BomText01)[1]) = 1][ns0:BomText01]"> 
      <xsl:value-of select="."/> 
     </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

它將只打印第一要素,因爲它選擇其中具有獨特BomText01價值BOM元素。這是預期的結果

如果BomText01是一個ID字段(因爲它似乎是),你有望獲得兩個結果(也許是因爲他們的ItemNumber包含不同的值),錯誤可能是在源(其中分配相等的ID時,它不應該這樣做)。

如果您在源中更改其中一個值,則應該可以選擇並驗證它們。

+0

@Held ...我給源代碼一看。謝謝 – MikeTWebb

+0

@Held ...我找到了答案。我在for-each中將= 1修改爲> = 1。收集所有兄弟節點與BomText01具有相同的鍵值'subsat' – MikeTWebb

+0

@幫助...我打算爲您的答案投票,因爲它對我來說是教育。我不知道接受它是否正確,因爲> = 1是答案。儘管感謝您的反饋 – MikeTWebb