Xml 分组翻译单元并避免重复
我有一个包含几个翻译单元的XML文件。“内容a”和“内容b”都有德语和法语翻译。“内容a”和“内容b”在此文件中都出现两次Xml 分组翻译单元并避免重复,xml,xslt,xpath,Xml,Xslt,Xpath,我有一个包含几个翻译单元的XML文件。“内容a”和“内容b”都有德语和法语翻译。“内容a”和“内容b”在此文件中都出现两次 <unit> <src lang="en">Content a</src> <trg lang="de">Translation content a</trg> </unit> <unit> <src lang="en">Content a<
<unit>
<src lang="en">Content a</src>
<trg lang="de">Translation content a</trg>
</unit>
<unit>
<src lang="en">Content a</src>
<trg lang="fr">Translation content a</trg>
</unit>
<unit>
<src lang="en">Content b</src>
<trg lang="de">Translation content b</trg>
</unit>
<unit>
<src lang="en">Content b</src>
<trg lang="fr">Translation content b</trg>
</unit>
内容a
翻译内容a
内容a
翻译内容a
内容b
翻译内容b
内容b
翻译内容b
我的目标是避免重复,因此这是我想要的输出:
<unit>
<src lang="en">Content a</src>
<trg lang="de">Translation content a</trg>
<trg lang="fr">Translation content a</trg>
</unit>
<unit>
<src lang="en">Content b</src>
<trg lang="de">Translation content b</trg>
<trg lang="fr">Translation content b</trg>
</unit>
<unit>
内容a
翻译内容a
翻译内容a
内容b
翻译内容b
翻译内容b
到目前为止,我的样式表:
<xsl:template match="unit">
<xsl:copy>
<xsl:copy-of select="src"/>
<xsl:for-each-group select="current-group()/(* except src)" group-by="node-name(.)">
<xsl:for-each-group select="current-group()" group-by=".">
<xsl:copy-of select="."/>
</xsl:for-each-group>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
它产生以下输出:
<unit>
<src lang="en">Content a</src>
<trg lang="de">Translation content a</trg>
<trg lang="fr">Translation content a</trg>
<trg lang="de">Translation content b</trg>
<trg lang="fr">Translation content b</trg>
</unit>
内容a
翻译内容a
翻译内容a
翻译内容b
翻译内容b
感谢您的帮助。提供了格式良好的(!)输入,例如:
<units>
<unit>
<src lang="en">Content a</src>
<trg lang="de">Translation content a</trg>
</unit>
<unit>
<src lang="en">Content a</src>
<trg lang="fr">Translation content a</trg>
</unit>
<unit>
<src lang="en">Content b</src>
<trg lang="de">Translation content b</trg>
</unit>
<unit>
<src lang="en">Content b</src>
<trg lang="fr">Translation content b</trg>
</unit>
</units>
相反
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/units">
<xsl:copy>
<xsl:for-each-group select="unit" group-by="src">
<unit>
<xsl:copy-of select="src"/>
<xsl:copy-of select="current-group()/trg"/>
</unit>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<units>
<unit>
<src lang="en">Content a</src>
<trg lang="de">Translation content a</trg>
<trg lang="fr">Translation content a</trg>
</unit>
<unit>
<src lang="en">Content b</src>
<trg lang="de">Translation content b</trg>
<trg lang="fr">Translation content b</trg>
</unit>
</units>
<xsl:for-each-group select="unit" group-by="concat(src/@lang, '|', src)">