我被 XSLT 键应该是一个简单的问题所困扰。
如果它是相关的,我将被迫使用 XSLT 1.0 解析器。
示例 XML:
<updates>
<update>
<id>first</id>
<pkglist>
<collection arch='i686'>
<package name='bin' version='1.0'/>
</collection>
<collection arch='x86_64'>
<package name='bin' version='1.0'/>
</collection>
</pkglist>
</update>
<update>
<id>second</id>
<pkglist>
<collection arch='i686'>
<package name='bin' version='1.1'/>
<package name='conf' version='1.1'/>
</collection>
<collection arch='x86_64'>
<package name='bin' version='1.2'/>
<package name='conf' version='1.1'/>
</collection>
</pkglist>
</update>
<update>
<id>third</id>
<pkglist>
<collection arch='i686'>
<package name='bin' version='1.3'/>
<package name='conf' version='1.1'/>
<package name='src' version='1.3'/>
</collection>
<collection arch='x86_64'>
<package name='bin' version='1.3'/>
<package name='conf' version='1.2'/>
<package name='src' version='1.3'/>
</collection>
</pkglist>
</update>
</updates>
这个 XPATH 选择了我正在寻找的东西
/updates//update[pkglist/collection/package/@name = 'bin']/id/text()
我正在整个文档中查找具有“name”属性的包的所有“id”值。但在现实世界中,我拥有的包裹比手工列出的要多得多。
所以我想一把钥匙是要走的路
<xsl:key name="idByPackage" match="/updates//update/pkglist/collection/package/@name" use="../../../../id" />
但这并没有给我任何有用的东西
<xsl:key name="idByPackage" match="/updates//update/pkglist/collection/package/@name" use="../../../../id" />
<xsl:template match="/">
<xsl:apply-templates select="updates/update" />
</xsl:template>
<xsl:template match="update">
Updates:
<xsl:value-of select="id" />
Related updates
<xsl:apply-templates select="pkglist" />
</xsl:template>
<xsl:template match="pkglist">
<xsl:for-each select="key('idByPackage', collection/package/@name)">
<xsl:value-of select="." />
<xsl:value-of select="collection/package/@name" />
</xsl:for-each>
</xsl:template>
当我将密钥更改为此时,我知道我在正确的区域:
<xsl:key name="idByPackage" match="/updates//update/pkglist/collection/package/@name" use="../../../../pkglist/collection/package/@name" />
相同的 xsl 模板吐出我的包名称。
当我使用“对我来说看起来有效但不起作用”键运行模板时,我得到了这个:
Updates:
first
Related updates
Updates:
second
Related updates
Updates: third
Related updates
当我期望得到类似的东西时
Updates:
first
Related updates
second
third
Updates:
second
Related updates
first
third
Updates: third
Related updates
first
second
我究竟做错了什么?