如何让 XSLT 键功能适用于我的场景?
Posted
技术标签:
【中文标题】如何让 XSLT 键功能适用于我的场景?【英文标题】:How to get XSLT key-function working with my scenario? 【发布时间】:2021-12-23 09:59:02 【问题描述】:这是我的数据:
<Results>
<Result>
<Id>1</Id>
</Result>
<Result>
<Id>2</Id>
</Result>
</Results>
<Results>
<RefId>1</RefId>
<Text>One</Text>
</Results>
<Results>
<RefId>2</RefId>
<Text>Two</Text>
</Results>
输出应该是怎样的:
<OBR></OBR>
<OBX>One</OBX>
<OBR></OBR>
<OBX>Two</OBX>
我的 xslt 代码
<xsl:key name="test" match="Results/Result" use="Id"/>
<xsl:template match="Results/Result">
<OBR></OBR>
<xsl:for-each select="Results[key('test', RefId)/RefId]">
<OBX><xsl:value-of select="Text" /></OBX>
</xsl:for-each>
</xsl:template>
它不起作用。我的结果是:
<OBR></OBR>
<OBX>One</OBX>
<OBX>Two</OBX>
<OBR></OBR>
<OBX>One</OBX>
<OBX>Two</OBX>
我认为问题出在我的模板中的 for-each 上。每次模板运行时它都会循环两次。有什么建议吗?
【问题讨论】:
1.您的输入不是格式正确的 XML,无法由 XSLT 处理。 2. 请用文字说明你试图应用的逻辑。 感谢重播。我已经解决了,并在下面的答案中添加了解决方案。 【参考方案1】:我用它们的键功能把它不必要地复杂化了。我通过创建一个名为 ID 的变量来解决,它基于 Id 字段。然后在 for-each 中,我刚刚测试了变量和 RefId 元素是否匹配并且它工作正常。
<xsl:template match="Results/Result">
<xsl:variable name="ID" select="Id"></xsl:variable>
<OBR></OBR>
<xsl:for-each select="Results[(RefId = $ID)]">
<OBX><xsl:value-of select="Text" /></OBX>
</xsl:for-each>
</xsl:template>
【讨论】:
以上是关于如何让 XSLT 键功能适用于我的场景?的主要内容,如果未能解决你的问题,请参考以下文章
Chrome不会将我的XSLT样式表应用于我的本地XML文件