2017-07-21 50 views
2

我正在生成從XML文件中提取信息的報告。XPath 1.0:列出不同的值及其出現次數

<?xml version="1.0" encoding="UTF-8"?> 
<JoinedRoot> 
    <FlexoPlateReport> 
     <Device>A</Device> 
    </FlexoPlateReport> 
    <FlexoPlateReport> 
     <Device>B</Device> 
    </FlexoPlateReport> 
    <FlexoPlateReport> 
     <Device>A</Device> 
    </FlexoPlateReport> 
    <FlexoPlateReport> 
     <Device>C</Device> 
    </FlexoPlateReport> 
    <FlexoPlateReport> 
     <Device>C</Device> 
    </FlexoPlateReport> 
    <FlexoPlateReport> 
     <Device>B</Device> 
    </FlexoPlateReport> 
    <FlexoPlateReport> 
     <Device>A</Device> 
    </FlexoPlateReport> 
</JoinedRoot> 

基本上,我到目前爲止所做的工作是放在一起的XPath表達式,它將列出不同的設備。上面的XML中有三個設備(A,B和C)。以下是XPath表達式。

/JoinedRoot/FlexoPlateReport[not(Device/text()=preceding-sibling::FlexoPlateReport/Device/text())]/Device/text() 

我只限於XPath 1.0,否則我會使用distinct-values()函數。接下來我想要做的是返回第一個XPath表達式中列出的每個設備的計數。例如,從上面的XML會給我以下罪狀:

答:3
B:2
C:2

是否有可能在一個表達式返回這兩個名稱和數量?如果不是,是否有XPath表達式只會返回每個不同設備的計數。我永遠不會知道報告中有多少個不同的設備,或設備元素的值。因此,我不能簡單地爲特定的設備名稱寫count()函數。

在此先感謝!

+0

您運行此XPath 1.0的環境是什麼? –

+0

@ThomasW,我將在Esko的Automation Engine中將它用作SmartName。 –

+0

我只能快速瀏覽一下文檔,但在我看來,您可以使用Script SmartName。不確定Esko的JavaScript引擎是否支持XPath查詢,但您始終可以使用JavaScript本身遍歷文檔。 –

回答

1

如果您僅限於XPath 1.0,那麼使用單個查詢是不可能的。你需要一個兩步過程。如果您以編程方式進行這些查詢,請使用相應的編程語言(XSLT,PHP,JavaScript)基於第一個查詢的結果觸發計數查詢。

count(/JoinedRoot/FlexoPlateReport/Device[.='A']) 
相關問題