我有一个很大的xml文档(超过3.000行)。背景:我的测量软件允许导出为xml文件。为了节省一些工作,我想自动将问题翻译成不同的语言(19!)然后将它们添加到这个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()
,但我不知道如何更改现有文本或添加新的子项?
此外,我还必须找到问题。在这个例子中,问题块的位置是"5“。我想使用管道或循环一个接一个地处理问题并添加翻译。然后,我可以将完成的XML重新导入到软件中。
我希望这在某种程度上是清楚的;)
发布于 2020-10-19 01:21:42
以XSLT为例,这是一种设计用于转换XML文件的专用语言,您可以在R之间将参数(语言类型和翻译后的文本)传递给样式表进行转换。您可以使用xslt
包( xml2)
的姊妹)运行XSLT1.0脚本。注意: XSLT是一种工业语言,因此可以移植到其他有参数接口的语言(Java、Python、PHP)和executables。
具体来说,就是运行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")
输入(无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>
输出(新的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>
发布于 2020-10-20 05:11:31
我会这样做,但是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")
https://stackoverflow.com/questions/64279943
复制相似问题