Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用XSLT key()函数根据单独元素中的两个属性查找节点_Xslt_Xslkey - Fatal编程技术网

使用XSLT key()函数根据单独元素中的两个属性查找节点

使用XSLT key()函数根据单独元素中的两个属性查找节点,xslt,xslkey,Xslt,Xslkey,我尝试使用XSLT key()函数返回XML文件中符合以下两个条件的所有元素: code[code=$code]和祖先::code类型[type=$code类型]` 以下是输入XML的简化示例:

我尝试使用XSLT key()函数返回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了。