У меня есть некоторый XML, который выглядит следующим образом:
<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, который я использую для генерации кода Java из этого XML.Ранее я делал ключ, а затем генерировал класс 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>
... потому что полявнутри группы отличаются от таковых в других случаях.Мой ключ выше не покрывает этот случай.Есть ли способ сделать это?