这与我之前的问题有关,但我无法为此获得解决方案。在这里我还需要根据属性值比较两个节点,但这对我来说很难。请提供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>
答案 0 :(得分:2)
此转化:
<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()
函数。
答案 1 :(得分:1)
这是一个XSLT转换,但我想你的例子中的年份是错误的(在输入中它们都是2007年)
<?xml-stylesheet type="text/xsl"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<!-- Generally copy all elements and attributes -->
<xsl:template match="*">
<xsl:copy>
<xsl:copy-of select="@*" />
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<!-- For a link element, add the year -->
<xsl:template match="link">
<!-- Store the link id without the # -->
<xsl:variable name='i'><xsl:value-of select='substring(@id,2)' /></xsl:variable>
<!-- Copy the link element -->
<xsl:copy>
<xsl:copy-of select="@*" />
<xsl:apply-templates />
</xsl:copy>
<!-- Add the year as a lookup in the input XML -->
<year><xsl:value-of select='/comp/bibsection/bib[@id=$i]/citation/year/text()' /></year>
</xsl:template>
</xsl:stylesheet>