識別獨特的子樹,我有一些XML,看起來像這樣:在XSL
<root>
<message name="peter">
<field type="integer" name="pa" />
<group name="foo">
<field type="integer" name="action" />
<field type="integer" name="id" />
<field type="integer" name="value" />
</group>
</message>
<message name="wendy">
<field type="string" name="wa" />
<group name="foo">
<field type="integer" name="action" />
<field type="integer" name="id" />
<field type="integer" name="value" />
</group>
</message>
</root>
我有一些XSL,我使用生成此XML的Java代碼。以前我一直在做一個密鑰,然後爲每個組生成一個Java類。
<xsl:key name="groupsByName" match="//group" use="@name"/>
....
<xsl:for-each select="//group[generate-id(.) = generate-id(key('groupsByName',@name)[1])]">
<xsl:call-template name="class-for-group"/>
</xsl:for-each>
一切都很好。現在,我發現一些消息具有使用與其他地方存在的組相同名稱的組,但缺少其中一個字段。要繼續上面的示例XML:
<message name="nana">
<field type="string" name="na" />
<group name="foo">
<field type="integer" name="id" />
<field type="integer" name="value" />
</group>
</message>
存在名爲「foo」的組,但缺少名稱爲「action」的字段。
我想要做的是爲每個唯一的子樹生成一個Java類。這可能嗎?我無法弄清楚xsl:key
會是什麼樣子。我有最接近的想法是
<xsl:key name="groupsKey" match="//group" use="concat(@name,count(*))"/>
它適用於上面的例子,但很難優雅。如果有兩個名爲「foo」的組具有相同數量(但不同類型)的字段,則會失敗,所以它實際上不是解決方案。爲了清楚起見,理想的關鍵(或其他選擇)最終只會針對上面的「peter」和「wendy」情況調用一次模板,一次對於「nana」情況,以及對於這種情況再次一次:
<message name="hook">
<field type="string" name="ha" />
<group name="foo">
<field type="string" name="favourite_breakfast" />
<field type="integer" name="id" />
<field type="integer" name="value" />
</group>
</message>
...因爲組內的字段與其他情況下的字段不同。我上面的關鍵不包括這種情況。有沒有辦法做到這一點?
那麼,這是什麼問題?如果您要求某人提供「更加優雅」的解決方案,那麼您必須定義「優雅」。 – 2011-04-20 12:55:17
@Dimitre,我上面提供的密鑰實際上並不能解決問題。這是一個討厭的黑客。我會澄清。 – 2011-04-20 12:56:16
此外,你必須顯示必須產生的確切輸出 - 否則它沒有被定義,這顯然不是一個問題...... – 2011-04-20 12:58:48