<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>
如何在tagUsage元素中基于@gi创建一个XSL 1.0密钥到rendition元素,将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
。
答案 0 :(得分:4)
使用强>:
<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
答案 1 :(得分:1)
我发现使用第二个键()的以下内容适用于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>