Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 分组翻译单元并避免重复_Xml_Xslt_Xpath - Fatal编程技术网

Xml 分组翻译单元并避免重复

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<

我有一个包含几个翻译单元的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</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)">