0

TMX (xml ベースの翻訳メモリ ファイル) からデータを抽出しています。ファイルは次のようになります (<tu>エントリは複数あり、翻訳された文字列ごとに 1 つです)。

<?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。&lt;/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 以上のエントリがあると、非常に遅くなります)。

私が見逃している明らかなものはありますか?そのような方法はありますか?

注: 私は WSH Javascript を使用しているため、WSH で利用可能な任意の ActiveXObject にアクセスできます...

4

2 に答える 2

0

私が必要としていたのは物事を正しい順序に並べることだけだったので、ファイルを必要なものに変換するのに十分な XSLT を少しだけ学ぶことは、世界で最も悪いことではないと思います。ありがたいことに、XSLT は私のオプションの 1 つであるテキストに出力でき、 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>&#13;</xsl:text>
   <xsl:text>[FR]   </xsl:text><xsl:value-of select="tuv[@xml:lang = 'fr']/seg"/><xsl:text>&#13;</xsl:text>
   <xsl:text>[ES]   </xsl:text><xsl:value-of select="tuv[@xml:lang = 'es']/seg"/><xsl:text>&#13;</xsl:text>
   <xsl:text>[DE]   </xsl:text><xsl:value-of select="tuv[@xml:lang = 'de']/seg"/><xsl:text>&#13;</xsl:text>
   <xsl:text>[IT]   </xsl:text><xsl:value-of select="tuv[@xml:lang = 'it']/seg"/><xsl:text>&#13;</xsl:text>
   <xsl:text>[PT]   </xsl:text><xsl:value-of select="tuv[@xml:lang = 'pt']/seg"/><xsl:text>&#13;</xsl:text>
   <xsl:text>[JA]   </xsl:text><xsl:value-of select="tuv[@xml:lang = 'ja']/seg"/><xsl:text>&#13;</xsl:text>
   <xsl:text>[ZH]   </xsl:text><xsl:value-of select="tuv[@xml:lang = 'zh-CN']/seg"/><xsl:text>&#13;</xsl:text>
   <xsl:text>[CAP]  Yes&#13;</xsl:text>
   <xsl:text>[PL]   MyProduct#13;</xsl:text>
   <xsl:text>[DPT]  &#13;</xsl:text>
   <xsl:text>[REG]  &#13;</xsl:text>
   <xsl:text>[SOU]  Terminology Extraction&#13;</xsl:text>
   <xsl:text>[NOT]  </xsl:text><xsl:value-of select="prop"/><xsl:text>&#13;</xsl:text>
   <xsl:text>[HIS]  EL 2013/09/18&#13;</xsl:text>
   <xsl:text>[~]&#13;&#13;</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

エレガントでもコンパクトでもないことは認めますが、機能する限り、これは1回限りのプロセスであるため...許容できます。

于 2013-09-18T22:04:45.387 に答える
0

環境がquerySelector/querySelectorAllをサポートしている場合は、次を試してください。

xmldoc.querySelector("tuv[xml\\:lang='es']");

そうでない場合は、ループが唯一の方法だと思います。もちろん、ループを実行する jQuery のようなライブラリの使用を検討することもできます。

于 2013-09-18T19:34:18.107 に答える