我有一个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行中的节点。 任何帮助都非常有用!
答案 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
节点与form
值Adatte
匹配,因为它具有相同值的后续兄弟,并且没有子元素new
,并且因为此模板是为空,此节点将被删除。
作为XSLT分组的推荐参考,您可以查看http://www.dpawson.co.uk/xsl/sect2/N4486.html