xslt - 如何在另一个节点中声明一个将属性绑定到另一个属性的变量?
问题描述
我需要声明一个变量。我想在这个变量中链接/绑定 2 个属性。
<xsl:variable name="politiciens" select="Trans/Speakers/Speaker/@id='Trans/Episode/Section/Turn/@speaker'"/>`
XSL =
<xsl:for-each select="Trans/Speakers/Speaker[@check='yes']">
<!-- declare a variable which contain @id, and whom will link/tie @speaker from Turn-->
<xsl:variable name="politiciens" select="@id=//Turn/@Speaker" />
<tr>
<td><xsl:value-of select="@name"/></td>
td><xsl:value-of select="count(Trans/Episode/Section/Turn[@Speaker=$politiciens]/tour/motBDL[@lexeme='JE'])" /></td>
</tr>
</xsl:for-each>
XML =
<Trans scribe="ComputerName" audio_filename="Debat Hollande Sarkozy 1998" video_filename="" version="8" version_date="181221">
<Speakers>
<Speaker id="spk1" name="Nicolas Sarkozy" check="yes"/>
</Speakers>
<Episode>
<Section type="report" startTime="0" endTime="1408.652">
<Turn startTime="0" endTime="0.152">
<Sync time="0"/>
</Turn>
<Turn speaker="spk1" startTime="0.152" endTime="3.038">
<Sync time="0.152"/>
<tour nbmots="14" id="000000">
<motBDL lexeme="POUR">pour</motBDL>
</tour>
</Turn>
</Section>
</Episode>
</Trans>
预期 = 要链接在一起的两个属性<xsl:variable name="politiciens" select="@id='@speaker'"/>
解决方案
我认为听起来您需要阅读keys。如果要查找Turn
当前的元素,Speaker
可以像这样定义一个键
<xsl:key name="turns" match="Turn" use="@speaker" />
然后,在您xsl:for-each
的扬声器中,您可以使用键来计算turn
元素的数量,如下所示:
<xsl:value-of select="count(key('turns', @id)/tour/motBDL)" />
(我省略了检查,@lexeme='JE'
因为您的 XML 中没有任何匹配的值)
试试这个 XSLT 作为起点:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes" />
<xsl:key name="turns" match="Turn" use="@speaker" />
<xsl:template match="/">
<table>
<xsl:for-each select="Trans/Speakers/Speaker[@check='yes']">
<tr>
<td><xsl:value-of select="@name"/></td>
<td><xsl:value-of select="count(key('turns', @id)/tour/motBDL)" /></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
Speaker
而且,仅作为示例,如果您想列出各个回合,您还可以定义一个键来查找元素本身。
例如....
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes" />
<xsl:key name="speakers" match="Speaker" use="@id" />
<xsl:template match="/">
<table>
<xsl:for-each select="Trans/Episode/Section/Turn[@speaker != '']">
<tr>
<td><xsl:value-of select="key('speakers', @speaker)/@name"/></td>
<td><xsl:value-of select="@startTime" /></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
推荐阅读
- swift - 如何在 SwiftUI 中显示来自 url 的图像
- c++ - 在 C++ 中创建一个密码生成器,将密码保存在 .txt 中
- python - 如何打开无法启动的pygame窗口?
- python - 将 DCM 转换为 CSV 时由于缺少标签而导致 KeyError
- c# - Xamarin.forms - 无需导航即可重定向到另一个页面
- python - 为什么我的重新向量化的 sys.stdout.write() 方法在我取消链接后会被调用?
- c - GNU SASL GSSAPI 示例
- oauth-2.0 - 如果此 Web 应用程序使用 Auth0 OAuth2.0 隐式授权,是否可以自动更新邮递员的令牌?
- apache-camel - 如何更改骆驼幂等表名?
- angular - /admin 路由的 Angular 路由器出口