我是xslt的新手请提供基于属性值比较两个节点的xslt。
input.xml中:
<comp>
<alink>
<link id="0003"/>
<link id="0001"/>
<link id="0002"/>
</alink>
<bibsection>
<bib id="0001">2007</bib>
<bib id="0002">2008</bib>
<bib id="0003">2009</bib>
</bibsection>
</comp>
我的输出应该是,
的Output.xml:
<comp>
<alink>
<link id="0003"/><year>2009</year>
<link id="0001"/><year>2007</year>
<link id="0002"/><year>2008</year>
</alink>
<bibsection>
<bib id="0001">2007</bib>
<bib id="0002">2008</bib>
<bib id="0003">2009</bib>
</bibsection>
</comp>
提前感谢。
答案 0 :(得分:1)
使用密钥进行完整,高效且简短的转换:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kBibById" match="bib" use="@id"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="link">
<xsl:call-template name="identity"/>
<year><xsl:value-of select="key('kBibById', @id)"/></year>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<comp>
<alink>
<link id="0003"/>
<link id="0001"/>
<link id="0002"/>
</alink>
<bibsection>
<bib id="0001">2007</bib>
<bib id="0002">2008</bib>
<bib id="0003">2009</bib>
</bibsection>
</comp>
产生了想要的正确结果:
<comp>
<alink>
<link id="0003"/>
<year>2009</year>
<link id="0001"/>
<year>2007</year>
<link id="0002"/>
<year>2008</year>
</alink>
<bibsection>
<bib id="0001">2007</bib>
<bib id="0002">2008</bib>
<bib id="0003">2009</bib>
</bibsection>
</comp>
<强>解释强>:
identity rule “按原样”复制每个匹配的节点。
有一个模板覆盖身份模板 - 它匹配任何link
元素。此模板正文中的代码按名称调用标识模板以处理匹配的link
元素,然后使用文本节点子元素构造year
元素,其值为第一个元素的字符串值{ {1}}元素的bib
属性与匹配的id
元素的id
属性具有相同的值。选择此link
元素是使用 key()
函数完成的,该函数引用名为“kBibById”的 xsl:key
指令。
<强>通知强>:
上述身份规则的链接暂时无法使用 - 请暂时使用Internet Archives中的这一个:
http://web.archive.org/web/20081229160200/http://www.dpawson.co.uk/xsl/sect2/identity.html