如何让 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文件

xslt 的复杂场景

etcd 介绍经典适用场景安装配置测试

MyBatis的适用场景和生命周期

1. Windows Server 2016 分为哪几个版本,适用场景如何?

为啥 TZCNT 适用于我的 Sandy Bridge 处理器?