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 使用XSLT-2.0写入多个文本文件,按属性值分组_Xml_Xslt_Xslt 2.0 - Fatal编程技术网

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

Xml 使用XSLT-2.0写入多个文本文件,按属性值分组,xml,xslt,xslt-2.0,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">

给定如下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>

测试数据
英语/GUID-asdf.xml
德语/GUID-qwer.xml
指数
文本:编辑
文本:bearbeiten
英语/GUID-lkjh.xml
德语/GUID-poiu.xml
指数
文本:查找
正文:苏晨
英语/GUID-zxcv.xml
德语/GUID-vbnm.xml
指数
正文:替换
文本:ersetzen
我试图为每个xml生成一个文件:lang(本例中为2),其中每个文件都包含相应lang的文本

我从下面的代码开始,但是我看到变量被一次设置为所有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>

像您那样使用绝对路径
/@xml:lang
将返回由文件中找到的所有语言组成的节点集的属性


groupby
表达式通常作为选择组的表达式的相对路径给出。在您的情况下,这应该是
。/@xml\u lang
,因为分组标准位于父节点中。这将为每个
提供一种语言

解决方案,感谢Marcus&Martin:

<?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>


太棒了!谢谢你,马库斯!这就成功了。(虽然我现在必须弄清楚如何在输出文件中的每个段之间获得换行符…)这通常(安全地)通过添加编码为

的换行符来完成。对,但我不认为在结果文档块中插入该选项会有帮助。哦,那么我误解了输出文件中每个段之间的术语。你想把新行放在哪里?结果文件之外?我很困惑…@dbl,我想你不是想要
,而是想要
,将每组中的项目输出到新行上。