Создание ключа xsl путем "соединения" элементов
<t>
<rendition xml:id="b">color: blue</rendition>
<rendition xml:id="r">color: red</rendition>
<tagUsage gi="p" render="b" />
<tagUsage gi="emph" render="r" />
</t>
Как бы я создал ключ XSL 1.0 в элементы визуализации на основе @gi в элементе tagUsage, соединяя rendition/@xml:id к tagUsage/@render? Что-то вроде
<xsl:key name="rendition-by-tagName"
match="rendition"
use="//tagUsage[@xml:id of rendition = @render of tagUsage]/@gi" />
Таким образом, что при заданном "p" ключ вернет синий rendition
; при заданном "emph" ключ вернет красный rendition
.
2 ответа:
Используйте :
<xsl:key name="kRendByUsageGi" match="rendition" use="../tagUsage[@render=current()/@xml:id]/@gi"/>
Вот полная проверка :
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:key name="kRendByUsageGi" match="rendition" use="../tagUsage[@render=current()/@xml:id]/@gi"/> <xsl:template match="/"> <xsl:copy-of select="key('kRendByUsageGi', 'p')/text()"/> ======== <xsl:copy-of select="key('kRendByUsageGi', 'emph')/text()"/> </xsl:template> </xsl:stylesheet>
Когда это преобразование применяется к предоставленному XML-документу:
<t> <rendition xml:id="b">color: blue</rendition> <rendition xml:id="r">color: red</rendition> <tagUsage gi="p" render="b" /> <tagUsage gi="emph" render="r" /> </t>
Желаемый, правильный результат получается:
color: blue ======== color: red
Я обнаружил, что следующий, который использует второй ключ (), работает с xsltproc, так что, если это ваш целевой процессор, это должно помочь. Но с Саксоном это не работает.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:key name='kTagUsage' match='tagUsage' use='@render'/> <xsl:key name="kRendByUsageGi" match="rendition" use="key('kTagUsage', @xml:id)/@gi"/> <xsl:template match="/"> <xsl:copy-of select="key('kRendByUsageGi', 'p')/text()"/> ======== <xsl:copy-of select="key('kRendByUsageGi', 'emph')/text()"/> </xsl:template> </xsl:stylesheet>