我有这个xml文件:
<writer id_writer="1">
<name>name</name>
</writer>
<film id_writer="1">
</film>
如何使用xslt
打印每部电影的作者<xsl:for-each select="film">
<xsl:value-of select="writer[@id_writer='what to put here']/name"></xsl:value-of>
</xsl:for-each>
答案 0 :(得分:6)
在XSLT中解决此类交叉引用的最有效方法通常是使用键。键定义位于样式表的顶层,在任何模板之外,并指定要检索的节点以及如何计算每个节点的标识键值
<xsl:key name="writerById" match="writer" use="@id_writer" />
定义密钥后,您可以使用函数
按键值检索匹配的节点<xsl:value-of select="key('writerById', @id_writer)/name"/>
一些XSLT处理器(特别是Saxon EE的最新版本)将自动优化//writer[@id_writer = current()/@id_writer]
谓词,以便像显式的基于密钥的方法一样高效地执行,但如果您使用的话,这不是您必须依赖的东西。旧的或不太复杂的处理器。
答案 1 :(得分:1)
我认为您尝试将film
和writer
与其属性相关联,因此请尝试以下操作:
<xsl:for-each select="film">
<xsl:value-of select="../writer[@id_writer=current()/@id_writer]/name"/>
</xsl:for-each>
答案 2 :(得分:1)
直接回答您的问题&#39;是
current()/@id_writer
然而,这并不是使其工作所需的唯一因素,因为编写器节点不是电影节点树的一部分。根据您的问题得出完整的答案:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="text" encoding="iso-8859-1" omit-xml-declaration="yes" />
<xsl:template match="/body">
<xsl:for-each select="film">
<xsl:value-of select="/body/writer[@id_writer=current()/@id_writer]/name"/>
</xsl:for-each>
</xsl:template>
</xsl:transform>
完整的XML提供此功能:
<?xml version="1.0" encoding="UTF-8"?>
<body>
<writer id_writer="1">
<name>name</name>
</writer>
<film id_writer="1">
</film>
</body>
这里的工作示例:http://xsltransform.net/bFDb2Ck