如何使用 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>
我认为您正试图通过属性将 film
和 writer
联系起来,所以试试这个:
<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
我有这个 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>
我认为您正试图通过属性将 film
和 writer
联系起来,所以试试这个:
<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