2012-12-21 74 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>