基于属性比较2个节点集

时间:2012-07-04 13:55:16

标签: xml xslt xpath

我是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>

提前感谢。

1 个答案:

答案 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>

<强>解释

  1. identity rule “按原样”复制每个匹配的节点。

  2. 有一个模板覆盖身份模板 - 它匹配任何link元素。此模板正文中的代码按名称调用标识模板以处理匹配的link元素,然后使用文本节点子元素构造year元素,其值为第一个元素的字符串值{ {1}}元素的bib属性与匹配的id元素的id属性具有相同的值。选择此link元素是使用 key() 函数完成的,该函数引用名为“kBibById”的 xsl:key 指令。

  3. <强>通知

    上述身份规则的链接暂时无法使用 - 请暂时使用Internet Archives中的这一个:

    http://web.archive.org/web/20081229160200/http://www.dpawson.co.uk/xsl/sect2/identity.html