使用XSLT key()函数根据单独元素中的两个属性查找节点
我尝试使用XSLT key()函数返回XML文件中符合以下两个条件的所有使用XSLT key()函数根据单独元素中的两个属性查找节点,xslt,xslkey,Xslt,Xslkey,我尝试使用XSLT key()函数返回XML文件中符合以下两个条件的所有元素: code[code=$code]和祖先::code类型[type=$code类型]` 以下是输入XML的简化示例:
元素:
code[code=$code]和祖先::code类型[type=$code类型]`
以下是输入XML的简化示例:
请注意,注释实际上并不存在于实际的XML中,我只是在这里添加它们以澄清XML结构
下面是我尝试使用的XSLT转换,尽管它似乎不起作用:
这就是我希望key()函数返回的不同输入:
使用key()函数可以这样做吗?由于有成千上万的
和
元素,能够使用
是非常重要的。使用:
<xsl:key name="kCode" match="Code"
use="concat(ancestor::CodeType[1]/@type, '+', @code)"/>
<Code code="C1" description="Red"/>
====================
<Code code="C3" description="Blue"/>
<Code code="C3" description="Purple"/>
====================
<Code code="C1" description="Black"/>
这里是一个完整的转换:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kCode" match="Code"
use="concat(ancestor::CodeType[1]/@type, '+', @code)"/>
<xsl:template match="/">
<xsl:copy-of select="key('kCode', 'ABC+C1')"/>
====================
<xsl:copy-of select="key('kCode', 'ABC+C3')"/>
====================
<xsl:copy-of select="key('kCode', 'XYZ+C1')"/>
</xsl:template>
</xsl:stylesheet>
====================
====================
当此转换应用于以下文档时(提供的XML文本--纠正了格式错误):
生成所需的正确结果:
<xsl:key name="kCode" match="Code"
use="concat(ancestor::CodeType[1]/@type, '+', @code)"/>
<Code code="C1" description="Red"/>
====================
<Code code="C3" description="Blue"/>
<Code code="C3" description="Purple"/>
====================
<Code code="C1" description="Black"/>
Wow!XSLT的强大功能继续让我感到惊讶。这确实需要一个过程,从5个多小时减少到几秒钟。谢谢你,迪米特@MTS,不客气。是的,XSLT既强大又优雅——更不用说XSLT2.0和即将推出的XSLT3.0了。