使用xpath In Teiid将多个属性连接与节点值连接起来

时间:2016-11-10 18:53:07

标签: xml xslt xpath xquery teiid

这是我发布的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运算符似乎无法工作。 能帮忙吗?

1 个答案:

答案 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