循环中的循环不显示所有结果



我有两个文档。一个是XML:

<sdl>
<group>
    <trans-unit id="57628711-51bd-4e2c-811c-7fa7a5a1cac0">
        <source><g id="67">G_Source_1</g>Source_1</source>
        <seg-source><mrk mtype="seg" mid="4">Seg_Source_1</mrk></seg-source>
        <target><mrk mtype="seg" mid="4"><g id="67">G_Target_1</g>Target_1</mrk></target>
    </trans-unit>
</group>
<group>
        <trans-unit id="7da4f54e-1fa9-46b3-846e-e7745840dcd8">
            <source><g id="970">G_Source_6.1</g>Source_6<g id="971">G_Source_6.2</g></source>
            <seg-source><mrk mtype="seg" mid="921">Seg_Source_6</mrk></seg-source>
            <target><mrk mtype="seg" mid="921"><g id="970">G_Target_6.1</g>Target_6<g id="971">G_Target_6.2</g></mrk></target>
        </trans-unit>
</group>
</sdl>

另一个是分隔.txt文件的制表符。

G_Source_1  G_Target_1
G_Source_6.1    G_Target_6.1
G_Source_6.1    G_Target_6.2

此代码应将 XML 文件中<g>标记中的所有文本与 TXT 文件第一列中的所有文本进行映射。并把所有这些结果。

我有以下代码:

glo = File.open(glo_file)
sdlxlff = Nokogiri::XML(open(sdlxlff_file))
sdlxlff.remove_namespaces!
sdlxlff_content = sdlxlff.xpath("//trans-unit")
sdlxlff_content.each do |product| 
  source_sdl = product.xpath("source/g").text
  target_sdl = product.xpath("target//g").text
  mid = product.xpath("target//mrk/@mid")
  glo.each_line do |line|
    content_glo = line.split("t",2)
    source_glo = content_glo[0]
    target_glo = content_glo[1]
    if source_sdl == source_glo
      puts "same"
      puts source_glo
      puts source_sdl
      puts mid
    end
  end
end

但是只有一个结果 XML 的第一个字符串:

same
G_Source_1
G_Source_1
4

你能指出我的问题吗?现在我的代码只比较第一个<g>标签,并跳过了所有其他标签。

你的问题是,当有多个节点与你的xpath匹配时,调用text会将所有结果连接在一起:

sdlxlff_content.xpath('//trans-unit/target//g').text
# => "G_Target_1G_Target_6.1G_Target_6.2"

为了避免这种情况,您需要在每个元素匹配时调用text

sdlxlff_content.xpath('//trans-unit/target//g').map { |x| x.text }
# => ["G_Target_1", "G_Target_6.1", "G_Target_6.2"]

因此,您可以将代码更改为如下所示:

sdlxlff_content.each do |product| 
  source_sdl = product.xpath("source/g").map { |x| x.text }
  target_sdl = product.xpath("target//g").map { |x| x.text }
  mid = product.xpath("target//mrk/@mid")
  glo.each_line do |line|
    content_glo = line.split("t",2)
    source_glo = content_glo[0]
    target_glo = content_glo[1]
    if source_sdl.any? { |x| x == source_glo }
      puts "same"
      puts source_glo
      puts "#{source_sdl}"
      puts mid
    end
  end
end

输出:

same
G_Source_1
["G_Source_1"]
4
same
G_Source_6.1
["G_Source_6.1", "G_Source_6.2"]
921
same
G_Source_6.1
["G_Source_6.1", "G_Source_6.2"]
921

非常感谢。但是我发现了一个问题。第一次运行第二次循环后我没有关闭文件。在第一个循环结束之前添加 glo.close 后。都变得像外在一样工作。

问候斯坦尼斯拉夫

相关内容

  • 没有找到相关文章

最新更新