給出的以下XML文檔選擇元件組的第一元素:使用XSLT 1.0
<foo>
<bar>
<type>1</type>
<id>1</id>
<a1>0</a1>
<other_stuff/>
</bar>
<bar>
<type>1</type>
<id>1</id>
<a1>0</a1>
<other_stuff/>
</bar>
<bar>
<type>1</type>
<id>2</id>
<a1>0</a1>
<other_stuff/>
</bar>
<bar>
<type>1</type>
<id>2</id>
<a1>0</a1>
<other_stuff/>
</bar>
</foo>
bar
是列表元素,按類型和id邏輯上分組的XML元素。因此,示例文檔包含兩個有序列表(type = 1和id = 1,type = 1和id = 2),每個列表包含兩個元素。在真實文檔中,還有更多不同長度的列表(使用不同類型和ID)。
現在我需要用不同的值更新每個列表的第一個元素a1
,下列文件中:
<foo>
<bar>
<type>1</type>
<id>1</id>
<a1>-100</a1>
<other_stuff/>
</bar>
<bar>
<type>1</type>
<id>1</id>
<a1>0</a1>
<other_stuff/>
</bar>
<bar>
<type>1</type>
<id>2</id>
<a1>-100</a1>
<other_stuff/>
</bar>
<bar>
<type>1</type>
<id>2</id>
<a1>0</a1>
<other_stuff/>
</bar>
</foo>
在僞SQL這可能會是這樣的:
update bar set a1 = -100 where position() = 1 group by type, id
這是可能的XSLT 1.0?我認爲可以歸結爲能夠編寫一個XPath表達式,其結果與我的僞SQL語句相同。
只是爲了我的理解:'xsl:key'使用子元素'type'和'd'的內容的字符串連接爲所有'bar'元素生成一個鍵。然後'generate-id(...)'函數調用會重新生成該鍵並檢查它是否與當前元素相匹配。這將爲每個類型(id對)創建一個列表,然後選擇其中的第一個。這或多或少是正確的? – Markus
@Markus,我已經添加了關於使用方法的一些解釋,我已經採用了XSLT 2.0的一種方式,因爲那裏的表達更容易表達,更接近自然語言。 –