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:key name="rendition-by-tagName" 
         match="rendition" 
         use="//tagUsage[@xml:id of rendition = @render of tagUsage]/@gi" />

这样给定“p”,键将返回蓝色rendition;给定“emph”,键将返回红色rendition

4

2 回答 2

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
于 2012-12-21T04:33:59.417 回答
1

我发现使用第二个 key() 的以下内容可与 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>
于 2012-12-28T16:40:48.450 回答