使用XSLT合并类似的属性

时间:2014-12-31 13:10:13

标签: xml xslt

我有一个XML文件,其结构如下:

  <forms>
     <f form="AGAtam"><na><acc/><sg/><mas/></na><s stem="AGAta"/><m meaning="slayer, killer"/>    
     </f>
     <f form="Adatte"><s stem=""/><m meaning="he seizes, carries away"/></f>
     <f form="Adatte"><new/><s stem=""/><m meaning="he seizes, carries away, takes to a different place"/></f>
     </forms>

我现在想要的是一个XSLT模板,它将所有没有new-tag的节点替换为具有这种标记的节点的子节点,同时保持所有其他子节点/属性相同。在这种情况下,它意味着用第5行中的节点替换第4行中的节点。 任何帮助都非常有用!

1 个答案:

答案 0 :(得分:0)

实现此目的的一种方法是删除所有f个节点,这些节点具有form相同值的后续兄弟节点且没有子元素new

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" doctype-public="XSLT-compat" 
    omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
  <xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="f[not(new) and @form = following-sibling::f/@form]"/>
</xsl:transform>

当应用于您的输入时,XML具有结果

<forms>
 <f form="AGAtam">
  <na>
     <acc/>
     <sg/>
     <mas/>
  </na>
  <s stem="AGAta"/>
  <m meaning="slayer, killer"/>
 </f>
 <f form="Adatte">
   <new/>
   <s stem=""/>
   <m meaning="he seizes, carries away, takes to a different place"/>
 </f>
</forms>

模板匹配

<xsl:template match="f[not(new) and @form = following-sibling::f/@form]"/>

将第一个f节点与formAdatte匹配,因为它具有相同值的后续兄弟,并且没有子元素new,并且因为此模板是为空,此节点将被删除。

作为XSLT分组的推荐参考,您可以查看http://www.dpawson.co.uk/xsl/sect2/N4486.html