2012-12-21 75 views
4
<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/@ xml:id加入tagUsage/@ render?像通过“加入”元素创建xsl键

<xsl:key name="rendition-by-tagName" 
     match="rendition" 
     use="//tagUsage[@xml:id of rendition = @render of tagUsage]/@gi" /> 

东西,所以,鉴于“P”键将返回蓝色rendition;给予“emph”,钥匙将返回红色rendition

回答

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 
+0

我认为Google Chrome使用的任何xslt处理器都存在一个错误。在oXygen中的Xalan和Saxon以及Firefox和Internet Explorer中的客户端处理中,这不起作用:current()不引用匹配的元素。育。 – JPM

+0

@JPM,是的,我也听说过Chrome的“安全”功能,严重限制了客户端XSLT处理。由于XSLT的实现并不如人意,人们会认真考虑Saxon CE,我相信它在所有五种主流浏览器下都是正常的XSLT 2.0处理器。 –

+0

我倾向于认为这是一个错误。我发现@use中的current()在xsltproc和Safari中也失败了。 Chrome,Safari和xsltproc,我相信,通用的xslt代码。 – JPM

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>