通过其中一个属性的值搜索子元素

时间:2013-09-18 19:13:00

标签: javascript xml utf-8 wsh getelementsbytagname

我正在从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 ...

2 个答案:

答案 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>&#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>

我承认它不优雅或紧凑,但只要它有效,并且因为这是一次性的过程......它是可以接受的。