给出这样的XML:
<?xml version="1.0" encoding="UTF-8"?>
<tmx version="1.4">
<header creationtool="ACME TM Editor">
<prop type="x-acme-db-name">test_deu</prop>
</header>
<body>
<tu srclang="en">
<prop type="x-acme-source-ipath">English/GUID-asdf.xml</prop>
<prop type="x-acme-target-ipath">German/GUID-qwer.xml</prop>
<prop type="x-acme-tm-uda-SID">Index</prop>
<tuv xml:lang="en">
<seg>text:editing</seg>
</tuv>
<tuv xml:lang="de">
<seg>Text:bearbeiten</seg>
</tuv>
</tu>
<tu srclang="en">
<prop type="x-acme-source-ipath">English/GUID-lkjh.xml</prop>
<prop type="x-acme-target-ipath">German/GUID-poiu.xml</prop>
<prop type="x-acme-tm-uda-SID">Index</prop>
<tuv xml:lang="en">
<seg>text:finding</seg>
</tuv>
<tuv xml:lang="de">
<seg>Text:suchen</seg>
</tuv>
</tu>
<tu srclang="en">
<prop type="x-acme-source-ipath">English/GUID-zxcv.xml</prop>
<prop type="x-acme-target-ipath">German/GUID-vbnm.xml</prop>
<prop type="x-acme-tm-uda-SID">Index</prop>
<tuv xml:lang="en">
<seg>text:replacing</seg>
</tuv>
<tuv xml:lang="de">
<seg>Text:ersetzen</seg>
</tuv>
</tu>
</body>
</tmx>
我正在尝试为每个xml生成一个文件:lang(在本例中为2),其中每个文件都包含相应语言的文本。
我从下面的代码开始,但我看到变量一次被设置为所有lang值(“en de en de en de”)。任何有关如何解决此问题以获得所需输出的帮助将不胜感激。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="text" encoding="UTF-8" />
<xsl:template match="/tmx/body">
<xsl:for-each-group select="tu/tuv/seg" group-by="//@xml:lang">
<xsl:variable name="lg" select="//@xml:lang" />
<xsl:result-document href="foo_{$lg}.txt" method="text">
<xsl:copy-of select="current-group()" />
</xsl:result-document>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:1)
使用绝对路径//@xml:lang
将返回节点集的属性,这些属性由文件中的所有语言组成。
group-by
表达式通常作为选择组的表达式的相对路径给出。在您的情况下,这应该只是../@xml_lang
,因为分组标准位于父节点中。这将为每个<seg>
提供一种语言。
答案 1 :(得分:0)
解决方案,感谢Marcus&amp;马丁:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="text" encoding="UTF-8" />
<xsl:template match="/tmx/body">
<xsl:for-each-group select="tu/tuv/seg" group-by="../@xml:lang">
<xsl:variable name="lg" select="../@xml:lang" />
<xsl:result-document href="foo_{$lg}.txt" method="text">
<xsl:value-of select="current-group()" separator=" " />
</xsl:result-document>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>