我有两个文档。一个是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 后。都变得像外在一样工作。
问候斯坦尼斯拉夫