这与我之前的问题有关,但是我无法为此找到解决方案。在这里我还需要根据属性值比较两个节点,但是这对我来说很困难。请提供xsl以执行此操作。提前致谢。
input.xml:
<comp>
<alink>
<link id="#c1-0003"/>
<link id="#c1-0001"/>
<link id="#c1-0002"/>
</alink>
<bibsection>
<bib id="c1-0001">
<citation>
<Name>Boud</Name> (<year>2007</year>)
<vol>32</vol> (<issue>3</issue>
</citation>
</bib>
<bib id="c1-0002">
<citation>
<Name>john</Name>(<year>2008</year>)
<vol>32</vol> (<issue>3</issue>)
</citation>
</bib>
<bib id="c1-0003">
<citation>
<name>nnc</name>(<year>2009</year>)
<vol>32</vol> (<issue>3</issue>)
</citation>
</bib>
</bibsection>
</comp>
output.xml:
<comp>
<alink>
<link id="#c1-0003"/>
<year>2009</year>
<link id="#c1-0001"/>
<year>2007</year>
<link id="#c1-0002"/>
<year>2008</year>
</alink>
<bibsection>
<bib id="c1-0001">
<citation>
<Name>Boud</Name> (<year>2007</year>)
<vol>32</vol> (<issue>3</issue>
</citation>
</bib>
<bib id="c1-0002">
<citation>
<Name>john</Name>(<year>2008</year>)
<vol>32</vol> (<issue>3</issue>)
</citation>
</bib>
<bib id="c1-0003">
<citation>
<name>nnc</name>(<year>2009</year>)
<vol>32</vol> (<issue>3</issue>)
</citation>
</bib>
</bibsection>
最佳答案
此转换:
<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"/>
<xsl:apply-templates select="key('kBibById', substring(@id, 2))/*/year"/>
</xsl:template>
</xsl:stylesheet>
当应用于提供的XML文档时(更正为包含不同年份):
<comp>
<alink>
<link id="#c1-0003"/>
<link id="#c1-0001"/>
<link id="#c1-0002"/>
</alink>
<bibsection>
<bib id="c1-0001">
<citation>
<Name>Boud</Name> (
<year>2007</year>)
<vol>32</vol> (
<issue>3</issue>
</citation>
</bib>
<bib id="c1-0002">
<citation>
<Name>john</Name>(
<year>2008</year>)
<vol>32</vol> (
<issue>3</issue>)
</citation>
</bib>
<bib id="c1-0003">
<citation>
<name>nnc</name>(
<year>2009</year>)
<vol>32</vol> (
<issue>3</issue>)
</citation>
</bib>
</bibsection>
</comp>
产生想要的正确结果:
<comp>
<alink>
<link id="#c1-0003"/>
<year>2009</year>
<link id="#c1-0001"/>
<year>2007</year>
<link id="#c1-0002"/>
<year>2008</year>
</alink>
<bibsection>
<bib id="c1-0001">
<citation>
<Name>Boud</Name> (
<year>2007</year>)
<vol>32</vol> (
<issue>3</issue>
</citation>
</bib>
<bib id="c1-0002">
<citation>
<Name>john</Name>(
<year>2008</year>)
<vol>32</vol> (
<issue>3</issue>)
</citation>
</bib>
<bib id="c1-0003">
<citation>
<name>nnc</name>(
<year>2009</year>)
<vol>32</vol> (
<issue>3</issue>)
</citation>
</bib>
</bibsection>
</comp>
说明:
这是解决该问题的最短,最简单,最易读和最有效的解决方案之一。
与上一个问题的解决方案唯一的区别是,现在
id
元素的link
属性的值与id
元素的bib
属性的值不完全相同。我们需要从第二个字符开始提取前一种类型的任何值的子字符串(即跳过第一个字符)。使用标准的XPath
substring()
函数可以很自然地做到这一点。
关于xml - 根据属性比较2个节点集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11343212/