Xml 使用XSLT-2.0写入多个文本文件,按属性值分组
给定如下XML: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 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=" " />
</xsl:result-document>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
太棒了!谢谢你,马库斯!这就成功了。(虽然我现在必须弄清楚如何在输出文件中的每个段之间获得换行符…)这通常(安全地)通过添加编码为
的换行符来完成代码>。对,但我不认为在结果文档块中插入该选项会有帮助。哦,那么我误解了输出文件中每个段之间的术语。你想把新行放在哪里?结果文件之外?我很困惑…@dbl,我想你不是想要
,而是想要
,将每组中的项目输出到新行上。