这是我发布的here问题的副本 我只需要注意这是在teiid引擎的XMLTABLE中发生的。我正在解析以下xml内容:
library(shiny)
ui<-fluidPage(
titlePanel(title = "My app"),
sidebarLayout(
sidebarPanel(
fileInput('file1', 'Cargar archivo',
accept = c(
'text/csv',
'text/comma-separated-values',
'text/tab-separated-values',
'text/plain',
'.csv',
'.tsv'
)
),
checkboxInput('header', '¿Contiene Encabezado?', TRUE),
radioButtons('sep', 'Delimitador',
c(Comma=',',
"Punto y coma"=';',
Tab='\t'),
','),
radioButtons('quote', 'Quote',
c(Ninguna='',
'Dobles'='"',
'Simples'="'"),
'"'),
radioButtons('resume', 'Summary',
c('Individual',
'Múltiple'), selected = "Múltiple",
inline = TRUE),
conditionalPanel("input.resume === 'Individual'",
selectInput('xcol', 'Variable X', ""),
sliderInput("bins","Seleccione el número de clases",min=5, max = 15, value = 6),
radioButtons("color","Seleccione un color", c("Amarillo","Azul","Rojo","Gris"), selected = "Azul", inline = TRUE)
)
),
mainPanel(h3("Muestra del archivo cargado:"),
tableOutput('contents'),
verbatimTextOutput("summary"),
plotOutput("histog")
)
)
)
server<-function(input, output, session) {
tableData <- reactive({
inFile <- input$file1
if (!is.null(inFile)){
read.csv(inFile$datapath, header=input$header, sep=input$sep,
quote=input$quote)
}
else {
return(NULL)
}
})
observe({
updateSelectInput(
session,
"xcol",
choices=names(tableData()))
})
var_name<-reactive(input$xcol)
output$contents <- renderTable({
head(tableData())
})
output$summary <- renderPrint({
summary(tableData())
})
output$histog<-renderPlot({
hist(tableData[,c("var_name")],breaks= seq(0,10,l=input$bins+1), col(input$color))
})
}
shinyApp(ui = ui, server = server)
使用
<AttributeSets>
<ns2:ItemAttributes xml:lang="de-DE">
<ns2:Creator Role="Role1">Creator One</ns2:Creator>
<ns2:Creator Role="Role2">Creator Two</ns2:Creator>
<ns2:Creator Role="Role3">Creator Three</ns2:Creator>
</ns2:ItemAttributes>
</AttributeSets>
这里x.AttributeSets是一个xml类型变量,其内容来自上面。
我正在尝试使用xpath将其格式化并组合成一行。 类似的东西:
Select * From
XMLTABLE(XMLNAMESPACES( DEFAULT 'http://ns1',
'http://ns2/default.xsd' as ns2 ),
'AttributeSets/ns2:ItemAttributes' PASSING x.AttributeSets
COLUMNS
Creator STRING PATH 'string-join(//ns2:Creator/(@Role, node()) , '', '')'
) p;
我想,我在某个地方很近,因为这个:
string-join(//ns2:Creator/concat(./text(), @Role), ', ')
工作并给我一个以逗号分隔的角色列表:Role1,Role2,Role3
和这个
string-join(//ns2:Creator/@Role , ', ')
结合了创作者的价值观:“造物主一,造物主二,造物主三”。
我想要
的最终输出string-join(//ns2:Creator/node(), ', ')
我能得到的最多的是:
Role1: Creator One, Role2: Creator Two, Role3: Creator Three
此逗号将所有角色和创建者分隔为一行。由于某种原因,concat运算符似乎无法工作。 能帮忙吗?
答案 0 :(得分:1)
尝试以下xpath
string-join(for $n in /AttributeSets/ItemAttributes/Creator return concat($n/@Role, ':',$n/text()),',')
请记住根据源树上下文调整 中的选择器xpath。因此我假设文件根
/AttributeSets/ItemAttributes/Creator
W3C处的字符串连接功能的文档有一个非常相似的例子。
<强>更新强>
我想,我在某个地方很近,因为这样:......工作并给我一个以逗号分隔的角色列表:Role1,Role2,Role3
认为你很亲密。我尝试了一点点调整,这很有效:
string-join(//ns2:Creator/concat(@Role, ':', ./text()), ', ')
由于某种原因,concat运算符似乎无法工作。
不确定,我使用在线xpath测试器here进行了检查,结果非常好。事实上,在线工具也接受你的xapth以及以下输出:
Creator OneRole1, Creator TwoRole2, Creator ThreeRole3