如何使用xslt按属性选择元素

时间:2015-02-23 12:00:38

标签: xml xslt

我有这个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>

3 个答案:

答案 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)

我认为您尝试将filmwriter与其属性相关联,因此请尝试以下操作:

<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