У меня есть список людей в people.xml
, которые содержат ссылки на семейные отношения в атрибутах @trait
и @rel
.Таким образом, записи являются рекурсивными для списка, где @rel
содержит @xml:id
.
<person xml:id="person_a">
<firstname>John</firstname>
<lastname>Foo</lastname>
<trait type="spouse_of" rel="#person_b">
<trait type="parent_of" rel="#person_c #person_d">
<person>
<person xml:id="person_b">
<firstname>Sarah</firstname>
<lastname>Foo</lastname>
<trait type="spouse_of" rel="#person_a">
<trait type="parent_of" rel="#person_c #person_d">
<person>
<person xml:id="person_c">
<firstname>Henry</firstname>
<lastname>Foo</lastname>
<trait type="child_of" rel="#person_a #person_b">
<trait type="sibling_of" rel="#person_d">
<person>
<person xml:id="person_d">
<firstname>Tom</firstname>
<lastname>Foo</lastname>
<trait type="child_of" rel="#person_a #person_b">
<trait type=sibling_of" rel="#person_c">
<person>
....
Используя XSL 3.0 / Saxon, я пытаюсь вывести семейные отношения в следующий формат:
<perslist>
<person>
<name>John Foo</name>
<relation>spouse of Sarah Foo</relation>
<relation>parent of Henry Foo, Tom Foo</relation>
</person>
<person>
<name>Sarah Foo</name>
<relation>spouse of John Foo</relation>
<relation>parent of Henry Foo, Tom Foo</relation>
</person>
<person>
<name>Henry Foo</name>
<relation>child of John Foo, Sarah Foo</relation>
<relation>sibling of Tom Foo</relation>
</person>
<person>
<name>Tom Foo</name>
<relation>child of John Foo, Sarah Foo</relation>
<relation>sibling of Henry Foo</relation>
</person>
...
</perslist>
Большая часть этого выполняется и функционирует, но у меня возникают проблемы при работе с @rel
, поскольку он может содержать несколько значений.
Я использую ключ для поиска xml:id
s.Я пытаюсь использовать tokenize()
, чтобы разделить идентификаторы, содержащиеся в @rel
, но у меня ничего не получается.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform version="3.0">
<xsl:key name="ids" match="person" use="@xml:id"/>
....
<xsl:template match="trait">
<xsl:variable name="trt" select="."/>
<xsl:choose>
<xsl:when test=".[@type='spouse_of']">
<relation>spouse of
<xsl:for-each select="tokenize($trt/@rel, ' ')">
<xsl:value-of select="key('ids',substring-after(.,'#'))/firstname, key('ids',substring-after(.,'#'))/lastname" separator=", "/>
</xsl:for-each>
</relation>
</xsl:when>
<xsl:when test=".[@type='parent_of']">
<relation>parent of
<xsl:for-each select="tokenize($trt/@rel, ' ')">
<xsl:value-of select="key('ids',substring-after(.,'#'))/firstname, key('ids',substring-after(.,'#'))/lastname" separator=", ">
</xsl:for-each>
</relation>
</xsl:when>
<xsl:when test=".[@type='child_of']">
<relation>child of
<xsl:for-each select="tokenize($trt/@rel, ' ')">
<xsl:value-of select="key('ids',substring-after(.,'#'))/firstname, key('ids',substring-after(.,'#'))/lastname" separator=", ">
</xsl:for-each>
</relation>
</xsl:when>
</xsl:template>
</xsl:stylesheet>
В частности, Саксон говорит мне: «Невозможно вызвать функцию key (), когдаэлемент контекста не является узлом "
Спасибо за любые предложения.
Nb.исправлены ошибки xml и xsl