我有一个很大的xml文档(超过3.000行(。背景:我的调查软件允许导出为xml文件。为了节省一些工作,我想将问题自动翻译成不同的语言(19!(,然后将它们添加到这个xml中。下面的例子中有一个德语问题,以及英语和波斯语的翻译。我想要实现什么:插入子项<LANGENTRY LANG=";en";VALUE=ru";文本文本文本"/>并将xml与新的子项一起保存。
<QUESTIONBLOCK PLACE="5" TARGETLAYER="0" RANDOMIZED="false" NAME="" TUTOR="false">
<META KEY="KEEP_TOGETHER" VALUE="false"/>
<META KEY="METAKEY_ONLINE_QUESTION_SPACE" VALUE="DEFAULT"/>
<META KEY="METAKEY_VALIDATION_RULE" VALUE=""/>
<META KEY="METAKEY_TWO_COLUMN_PAPER" VALUE="false"/>
<EXPLANATION PLACE="1" NAME="[b]5. Seit wann wohnen Sie in Deutschland, Leipzig bzw. Ihrem
Wohngebiet? Bitte tragen Sie das Jahr ein." TUTOR="false">
<META KEY="METAKEY_ONLINE_QUESTION_SPACE" VALUE="DEFAULT"/>
<INTLVAL KEY="NAME">
<LANGENTRY LANG="en" VALUE="[b]5. Since when do you live in Germany, Leipzig or the residential area
you are living at the moment? Please enter the year. "/>
<LANGENTRY LANG="fa" VALUE="‌ـ از چه
زمانی تاکنون در
آلمان بترتیب در
لایپزیگ یا منطقه
مسکونی خود زندگی
می کنید؟"/>
</INTLVAL>
</EXPLANATION>
这是我尝试过的:xml_find_all(xml, xpath = "//LANGENTRY/@VALUE")%>%xml_text()
,但我不知道如何更改现有文本或添加新的子项?
此外,我还必须找到问题。在该示例中,它是questionblock place";5〃;。我想用管道或循环一个接一个地处理问题,并添加翻译。然后我可以将完成的XML导入回软件中。
我希望这在某种程度上是清楚的;(
考虑XSLT,这是一种专门用于转换XML文件的语言,您可以在R和样式表之间传递参数(语言类型和翻译文本(进行转换。您可以使用xslt
包(xml2)
的姊妹包(运行XSLT1.0脚本。请注意:XSLT是一种行业语言,因此可以移植到其他语言(Java、Python、PHP(和具有参数接口的可执行文件。
具体来说,运行Identity Transform模板,按原样复制XML,然后在搜索原始文本后,有条件地将参数绑定到INTLVAL
节点下的新LANGENTRY
节点。
XSLT (另存为.xsl文件,一个特殊的.xml文件(
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- INITIALIZE PARAMS -->
<xsl:param name="orig_text"/>
<xsl:param name="trans_lang"/>
<xsl:param name="trans_text"/>
<!-- IDENTITY TRANSFORM -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- ADD LANGENTRY NODES WITH BINDED PARAM VALUES -->
<xsl:template match="INTLVAL">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
<xsl:if test = "ancestor::EXPLANATION[@NAME = $orig_text]">
<LANGENTRY LANG="{$trans_lang}" VAL="{$trans_text}"/>
</xsl:if>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
R(用循环演示(
library(xml2)
library(xslt)
# READ XML AND XSLT
doc <- read_xml("Input.xml", package = "xslt")
style <- read_xml("Script.xsl", package = "xslt")
# TRANSLATION DATA
translations <- list(
list(orig = c("de", "[b]5. Seit wann wohnen Sie in Deutschland, Leipzig bzw. Ihrem Wohngebiet? Bitte tragen Sie das Jahr ein."),
other = c("en", "[b]5. Since when do you live in Germany, Leipzig or the residential area you are living at the moment? Please enter the year. ")),
list(orig = c("de", "[b]5. Seit wann wohnen Sie in Deutschland, Leipzig bzw. Ihrem Wohngebiet? Bitte tragen Sie das Jahr ein."),
oth = c("fa", "ـ از چه زمانی تاکنون در آلمان بترتیب در لایپزیگ یا منطقه مسکونی خود زندگی می کنید؟")),
list(orig = c("de", "Die Sanftmütigen werden die Erde erben"),
other = c("en", "The meek shall inherit the earth")),
list(orig = c("de", "Die Sanftmütigen werden die Erde erben"),
other = c("fr", "Les doux hériteront de la terre")),
list(orig = c("de", "Sein oder Nichtsein; das ist hier die Frage"),
other = c("en", "To be, or not to be: that is the question")),
list(orig = c("de", "Sein oder Nichtsein; das ist hier die Frage"),
oth = c("es", "¡Ser, o no ser, es la cuestión!"))
)
# LOOP THROUGH TRANSLATIONS AND PASS IN PARAMS FOR TRANSFORMATION
for (t in translations) {
doc <- xml_xslt(doc, style,
params=list(orig_text = t$orig[2], # LIST NAME MUST MATCH XSLT PARAM
trans_lang = t$oth[1], # LIST NAME MUST MATCH XSLT PARAM
trans_text = t$oth[2]) # LIST NAME MUST MATCH XSLT PARAM
)
}
# SAVE EDITED DOC TO FILE
output <- write_xml(doc, "Output.xml")
输入XML(无LANGENTRY节点(
<QUESTIONBLOCK PLACE="5" TARGETLAYER="0" RANDOMIZED="false" NAME="" TUTOR="false">
<META KEY="KEEP_TOGETHER" VALUE="false" />
<META KEY="METAKEY_ONLINE_QUESTION_SPACE" VALUE="DEFAULT" />
<META KEY="METAKEY_VALIDATION_RULE" VALUE="" />
<META KEY="METAKEY_TWO_COLUMN_PAPER" VALUE="false" />
<EXPLANATION PLACE="1" NAME="[b]5. Seit wann wohnen Sie in Deutschland, Leipzig bzw. Ihrem Wohngebiet? Bitte tragen Sie das Jahr ein." TUTOR="false">
<META KEY="METAKEY_ONLINE_QUESTION_SPACE" VALUE="DEFAULT" />
<INTLVAL KEY="NAME">
</INTLVAL>
</EXPLANATION>
<EXPLANATION PLACE="1" NAME="Die Sanftmütigen werden die Erde erben">
<META KEY="METAKEY_ONLINE_QUESTION_SPACE" VALUE="DEFAULT" />
<INTLVAL KEY="NAME">
</INTLVAL>
</EXPLANATION>
<EXPLANATION PLACE="1" NAME="Sein oder Nichtsein; das ist hier die Frage">
<META KEY="METAKEY_ONLINE_QUESTION_SPACE" VALUE="DEFAULT" />
<INTLVAL KEY="NAME">
</INTLVAL>
</EXPLANATION>
</QUESTIONBLOCK>
输出XML(新LANGENTRY节点(
<?xml version="1.0" encoding="UTF-8"?>
<QUESTIONBLOCK PLACE="5" TARGETLAYER="0" RANDOMIZED="false" NAME="" TUTOR="false">
<META KEY="KEEP_TOGETHER" VALUE="false"/>
<META KEY="METAKEY_ONLINE_QUESTION_SPACE" VALUE="DEFAULT"/>
<META KEY="METAKEY_VALIDATION_RULE" VALUE=""/>
<META KEY="METAKEY_TWO_COLUMN_PAPER" VALUE="false"/>
<EXPLANATION PLACE="1" NAME="[b]5. Seit wann wohnen Sie in Deutschland, Leipzig bzw. Ihrem Wohngebiet? Bitte tragen Sie das Jahr ein." TUTOR="false">
<META KEY="METAKEY_ONLINE_QUESTION_SPACE" VALUE="DEFAULT"/>
<INTLVAL KEY="NAME">
<LANGENTRY LANG="en" VAL="[b]5. Since when do you live in Germany, Leipzig or the residential area you are living at the moment? Please enter the year. "/>
<LANGENTRY LANG="fa" VAL="ٜـ از چه زمانی تاکنون در آلمان بترتیب در لایپزیگ یا منطقه مسکونی خود زندگی می کنید؟"/>
</INTLVAL>
</EXPLANATION>
<EXPLANATION PLACE="1" NAME="Die Sanftmütigen werden die Erde erben">
<META KEY="METAKEY_ONLINE_QUESTION_SPACE" VALUE="DEFAULT"/>
<INTLVAL KEY="NAME">
<LANGENTRY LANG="en" VAL="The meek shall inherit the earth"/>
<LANGENTRY LANG="fr" VAL="Les doux hériteront de la terre"/>
</INTLVAL>
</EXPLANATION>
<EXPLANATION PLACE="1" NAME="Sein oder Nichtsein; das ist hier die Frage">
<META KEY="METAKEY_ONLINE_QUESTION_SPACE" VALUE="DEFAULT"/>
<INTLVAL KEY="NAME">
<LANGENTRY LANG="en" VAL="To be, or not to be: that is the question"/>
<LANGENTRY LANG="es" VAL="¡Ser, o no ser, es la cuestión!"/>
</INTLVAL>
</EXPLANATION>
</QUESTIONBLOCK>
我会做如下操作,但HTML实体存在问题,我不知道为什么要替换它们。
library(xml2)
xml <- read_xml("waschi.xml")
x <- xml_new_root("LANGENTRY")
langentry <- xml_find_first(x, "//LANGENTRY")
xml_set_attr(langentry, "LANG", "ru")
xml_set_attr(langentry, "VALUE", "text text text")
intlval <- xml_find_first(xml, "//INTLVAL")
xml_add_child(intlval, langentry)
write_xml(xml, "waschi_new.xml")