写入多个文本文件,使用XSLT-2.0按属性值分组

时间:2013-12-05 19:22:40

标签: xml xslt xslt-2.0

给出这样的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>

2 个答案:

答案 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="&#10;" />
            </xsl:result-document>
        </xsl:for-each-group>
    </xsl:template>
</xsl:stylesheet>