如何使用 xslt 按属性 select 元素

How to select element by attribute with 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>

我认为您正试图通过属性将 filmwriter 联系起来,所以试试这个:

<xsl:for-each select="film">
    <xsl:value-of select="../writer[@id_writer=current()/@id_writer]/name"/>
</xsl:for-each>

在 XSLT 中解析此类交叉引用的最有效方法通常是使用 key。键定义位于样式表的顶层,在任何模板之外,并指定要检索的节点以及如何计算每个节点的标识键值

<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] 谓词以与显式基于键的方法一样高效地执行,但如果您是使用较旧或不太复杂的处理器。

你的 'what to put here' 的直接答案是

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