Рассмотрим XSLT , язык специального назначения, предназначенный для преобразования файлов XML, в который передаются языковые параметры, en и it из R в XSLT.R может запускать сценарии XSLT 1.0, используя пакет xslt
(расширение xml2
).
В частности, вы можете использовать тот же сценарий XSLT, передавая значения из R для определенных title узлов.Это мало чем отличается от передачи параметров другому известному языку специального назначения: SQL.Прелесть также в том, что XSLT является переносимым (опять же как SQL) и может быть запущен за пределами R, чтобы получить тот же результат.
XSLT сохранить как файл .xsl, специальный файл .xml)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="lang" />
<!-- IDENTITY TRANSFORM -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="book">
<xsl:copy>
<xsl:copy-of select="title[@xml:lang = $lang]"/>
<xsl:copy-of select="author"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
R
library(xml2)
library(xslt)
doc <- read_xml("Input.xml", package = "xslt")
style <- read_xml("Script.xsl", package = "xslt")
# en LANGUAGE
new_xml <- xml_xslt(doc, style, params=list(lang="en"))
write_xml(new_xml, "Output_en.xml")
# it LANGUAGE
new_xml <- xml_xslt(doc, style, params=list(lang="it"))
write_xml(new_xml, "Output_it.xml")
Python (для демонстрации мобильности)
import lxml.etree as et
# LOAD XML AND XSL SCRIPT
xml = et.parse('Input.xml')
xsl = et.parse('Script.xsl')
transform = et.XSLT(xsl)
# PASS en PARAMETER TO XSLT
n = et.XSLT.strparam("en")
result = transform(xml, lang=n)
with open("Output_en.xml", 'wb') as f:
f.write(result)
# PASS it PARAMETER TO XSLT
n = et.XSLT.strparam("it")
result = transform(xml, lang=n)
with open("Output_it.xml", 'wb') as f:
f.write(result)
PHP
// LOAD XML AND XSLT
$xml = new DOMDocument('1.0', 'UTF-8');
$xml->load('Input.xml');
$xsl = new DOMDocument('1.0', 'UTF-8');
$xsl->load('Script.xsl');
// INITIALIZE TRANSFORMER
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);
// SET en PARAMETER VALUE
$proc->setParameter('', 'lang', 'en');
$newXML = $proc->transformToDoc($xml);
file_put_contents('Output_en.xml', $newXML);
// SET en PARAMETER VALUE
$proc->setParameter('', 'lang', 'it');
$newXML = $proc->transformToDoc($xml);
file_put_contents('Output_it.xml', $newXML);