我正在从TMX中提取数据 - 一个基于xml的翻译记忆库文件。该文件看起来像这样(<tu>
条目是多个,每个翻译的字符串一个):
<?xml version="1.0" encoding="utf-8"?>
<tmx version="1.4">
<header creationtool="Multilizer" creationtoolversion="6.2.19" datatype="PlainText" segtype="sentence" adminlang="en" srclang="*all*" o-tmf="MLProject">
</header>
<body>
<tu>
<prop type="context">..\..\BuildProcess\Support_Files\CommonFiles\PSRIP\AlambicEdit.dll.Strings.126.2000</prop>
<tuv xml:lang="en-CA">
<seg>Error initializing library: %s.</seg>
</tuv>
<tuv xml:lang="en">
<prop type="status">tsQAed</prop>
<seg>Error initializing library: %s.</seg>
</tuv>
<tuv xml:lang="fr">
<prop type="status">tsQAed</prop>
<seg>Erreur lors de l'initialisation de la librairie %s.</seg>
</tuv>
<tuv xml:lang="de">
<prop type="status">tsQAed</prop>
<seg>Fehler bei der Initialisierung der Bibliothek: %s.</seg>
</tuv>
<tuv xml:lang="es">
<prop type="status">tsQAed</prop>
<seg>Error inicializando biblioteca: %s.</seg>
</tuv>
<tuv xml:lang="it">
<prop type="status">tsQAed</prop>
<seg>Errore di inizializzazione libreria: %s.</seg>
</tuv>
<tuv xml:lang="ja">
<prop type="status">tsQAed</prop>
<seg>ライブラリ初期化時のエラー: %s</seg>
</tuv>
<tuv xml:lang="zh-CN">
<prop type="status">tsQAed</prop>
<seg>初始化库时出错:%s。</seg>
</tuv>
<tuv xml:lang="pt">
<prop type="status">tsQAed</prop>
<seg>Erro ao inicializar biblioteca: %s.</seg>
</tuv>
</tu>
</body>
</tmx>
我需要按照特定顺序提取特定语言,而这些语言在TMX中并不总是受到尊重,例如DE和ES语言有时会被反转。
不幸的是,我还没有找到一种通过它的属性值来获取子元素的方法,所以我不能做像segment = x.getElementsByPropertyValue("xml:lang", "en")
这样的事情,这真的很棒。
我发现的唯一选择是遍历所有语言,并根据正确排序的语言数组(在10个不同文件中600k +条目上的速度非常慢)进行检查。 / p>
有什么明显的东西我不见了吗?有这样的方法吗?
注意:我使用的是WSH Javascript,因此我可以访问WSH中提供的任何ActiveXObject ...
答案 0 :(得分:0)
如果您的环境支持querySelector/querySelectorAll,请尝试:
xmldoc.querySelector("tuv[xml\\:lang='es']");
如果没有,我担心循环是唯一的方法。你当然可以考虑使用类似jQuery的库为你做循环。
答案 1 :(得分:0)
因为我所需要的只是按照正确的顺序排列,我想简单地学习一些XSLT并不足以将文件转换成我需要的东西。值得庆幸的是,XSLT可以输出到文本,这是我的选择之一,与JavaScript相比,它快速炽热 ......这是我的解决方案:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8" indent="no" omit-xml-declaration="yes" />
<xsl:template match="/">
<xsl:for-each select="tmx/body/tu">
<xsl:text>[EN] </xsl:text><xsl:value-of select="tuv[@xml:lang = 'en']/seg"/><xsl:text> </xsl:text>
<xsl:text>[FR] </xsl:text><xsl:value-of select="tuv[@xml:lang = 'fr']/seg"/><xsl:text> </xsl:text>
<xsl:text>[ES] </xsl:text><xsl:value-of select="tuv[@xml:lang = 'es']/seg"/><xsl:text> </xsl:text>
<xsl:text>[DE] </xsl:text><xsl:value-of select="tuv[@xml:lang = 'de']/seg"/><xsl:text> </xsl:text>
<xsl:text>[IT] </xsl:text><xsl:value-of select="tuv[@xml:lang = 'it']/seg"/><xsl:text> </xsl:text>
<xsl:text>[PT] </xsl:text><xsl:value-of select="tuv[@xml:lang = 'pt']/seg"/><xsl:text> </xsl:text>
<xsl:text>[JA] </xsl:text><xsl:value-of select="tuv[@xml:lang = 'ja']/seg"/><xsl:text> </xsl:text>
<xsl:text>[ZH] </xsl:text><xsl:value-of select="tuv[@xml:lang = 'zh-CN']/seg"/><xsl:text> </xsl:text>
<xsl:text>[CAP] Yes </xsl:text>
<xsl:text>[PL] MyProduct#13;</xsl:text>
<xsl:text>[DPT] </xsl:text>
<xsl:text>[REG] </xsl:text>
<xsl:text>[SOU] Terminology Extraction </xsl:text>
<xsl:text>[NOT] </xsl:text><xsl:value-of select="prop"/><xsl:text> </xsl:text>
<xsl:text>[HIS] EL 2013/09/18 </xsl:text>
<xsl:text>[~] </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
我承认它不优雅或紧凑,但只要它有效,并且因为这是一次性的过程......它是可以接受的。