【问题标题】:Convert XML using XSLT in R在 R 中使用 XSLT 转换 XML
【发布时间】:2020-03-18 00:51:32
【问题描述】:

我的任务目前由 SQL Server Reporting Services 执行,它使用将典型架构转换为定制架构的 XSLT 将数据集导出为 XML 格式。为了替换这个报告,当用户想要下载它时,我需要能够类似地转换 XML。

XSLT 产生的最终布局很糟糕——它涉及填充和各种古怪的连接,我宁愿不通过在从数据到 XML 的第一次转换中进行整个转换来重新发明轮子。

我的 google-fu 让我失望了:如何使用 R 通过 XSLT 转换 XML?

MWE

这是一个使用虹膜数据并将其转换为 XML 的脚本(我使用来自 CRAN 的包纯粹是为了降低示例的代码级别)。然后我有an XSLT (on gist),当我在 Visual Studio 中运行 XML 时会转换 XML,但我不知道如何将该活动转换为 R。

library(optiRum)
library(XML)
irisdata<-convertToXML(iris)
saveXML(irisdata,"iris.xml")

【问题讨论】:

  • 你可以执行系统调用来运行java吗?如果是这样,请下载 saxon9 PE 并运行它。我认为 R 没有原生 XSLT2.0 库

标签: xml r xslt


【解决方案1】:

我认为您正在寻找 Sxslt 包,仅使用示例数据

library("Sxslt")
library("XML")
files <- sapply(c("sqrt.xml", "sqrt.xsl"), function(f) system.file("examples", f, package = "Sxslt"))

files[1] 是一个 xml 文件,files[2] 是一个 xsl 文件

xmlParse(files[[1]])

<?xml version="1.0"?>
<test>
  <sqrt>9</sqrt>
  <date/>
  <code>mean(rnorm(10000))</code>
</test>

然后使用Sxslt 应用样式表

xsltApplyStyleSheet(files[1], files[2])

$doc
<?xml version="1.0" standalone="yes"?>
<HTML>
  <body>
 sqrt: 3
 pow: 81
 date: Thu Jan 15 06:46:54 2015<i class="output">-0.0140224652198879</i>
  substring: an(rnor</body>
</HTML>


$stylesheet
An object of class "XSLStyleSheet"
Slot "ref":
<pointer: 0x108ef2a60>


$status
OK 
 0 

attr(,"class")
[1] "XMLInternalXSLTDocument"

安装 Sxslt 的额外指导

  • 您需要先在您的 linux 机器上安装 libxslt-dev
  • 最新版本不再适用于 R 3.1.2,也不会从源代码进一步安装到其 repo 上的 Bug #1。好心的 bug 提出者拿了一个 fork 并修复了这个包,所以你可以使用 devtools::install_github("cboettig/Sxslt") 来安装它。

该版本已不再更新,但您可以使用:

install.packages("remotes")
remotes::install_github("omegahat/Sxslt")

【讨论】:

  • 会试一试!看起来只是我需要的工具包
  • 是的 - 我只是想安装它,它不是为 3.1.2 构建的,所以它给我带来了一些麻烦
  • 首先尝试使用 devtools 通过 repo 执行此操作,类似地尝试从 tar 文件 url 执行此操作。必须去在操作系统fatal error: libxml/tree.h: No such file or directory 上安装一些软件包。我很快就会回来,提供安装它的完整要求列表。
  • 指南作为建议编辑添加,以回答可能遇到类似问题的人
  • 确实:install.packages("remotes"); remotes::install_github("omegahat/Sxslt") 太糟糕了,我不能投票两次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多