В базе данных инструментом для представления отношений «многие ко многим» является таблица ассоциаций. Каждая строка в таблице представляет связь между двумя объектами. Таким образом, если заметка с идентификатором 1 появляется в списках с идентификаторами 1, 2 и 3, в таблице ассоциаций будет три строки:
ID NoteID ListID
-- ------ ------
1 1 1
2 1 2
3 1 3
Вы можете получить заметку и все связанные списки с помощью запроса:
SELECT [columns] FROM Association
JOIN Notes ON Note.ID = Association.NoteID
JOIN Lists ON List.ID = Association.ListID
WHERE Association.NoteID = @NoteID
И все заметки для списка:
SELECT [columns] FROM Association
JOIN Notes ON Note.ID = Association.NoteID
JOIN Lists ON List.ID = Association.ListID
WHERE Association.ListID = @ListID
Вот как вы это представляете в XML:
<Lists>
<List ID='1'>...</List>
<List ID='2'>...</List>
<List ID='3'>...</List>
...
<Lists>
<Notes>
<Note ID='1'>...</Note>
</Notes>
<Associations>
<Association ID='1' NoteID='1' ListID='1'/>
<Association ID='2' NoteID='1' ListID='2'/>
<Association ID='3' NoteID='1' ListID='3'/>
</Associations>
В XSLT вы можете получить доступ к этой ассоциации следующим образом:
<xsl:template match="List" mode="AssociatedNotes">
<xsl:variable name="Associations" select="/*/Associations/Association[@ListID=current()/@ID]"/>
<xsl:apply-templates select="/*/Notes[@ID=$Associations/@NoteID]"/>
</xsl:template>
<xsl:template match="Note" mode="AssociatedLists">
<xsl:variable name="Associations" select="/*/Associations/Association[@NoteID=current()/@ID]"/>
<xsl:apply-templates select="/*/Lists[@ID=$Associations/@ListID]"/>
</xsl:template>
(Обратите внимание на использование атрибута mode
, чтобы эти шаблоны не вызывали друг друга до тех пор, пока вы не переполните стек.)