【问题标题】:XQuery elements grouped by tags按标签分组的 XQuery 元素
【发布时间】:2017-01-18 02:11:43
【问题描述】:

拥有这个 XML 文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<productos>
<TITULO>DATOS DE LA TABLA PRODUCTOS</TITULO>
<producto>
    <cod_prod>1010</cod_prod>
    <denominacion>Placa Base MSI G41M-P26</denominacion>
    <precio>50</precio>
    <stock_actual>10</stock_actual>
    <stock_minimo>3</stock_minimo>
    <cod_zona>10</cod_zona>
  </producto>
  <producto>
    <cod_prod>1011</cod_prod>
    <denominacion>Micro Intel Core i5-2320</denominacion>
    <precio>120</precio>
    <stock_actual>3</stock_actual>
    <stock_minimo>5</stock_minimo>
    <cod_zona>10</cod_zona>
  </producto>
  <producto>
    <cod_prod>1012</cod_prod>
    <denominacion>Micro Intel Core i5 2500</denominacion>
    <precio>170</precio>
    <stock_actual>5</stock_actual>
    <stock_minimo>6</stock_minimo>
    <cod_zona>20</cod_zona>
  </producto>
  <producto>
    <cod_prod>1013</cod_prod>
    <denominacion>HD Seagate Barracuda 250GB SATA</denominacion>
    <precio>80</precio>
    <stock_actual>10</stock_actual>
    <stock_minimo>5</stock_minimo>
    <cod_zona>20</cod_zona>
  </producto>
  <producto>
    <cod_prod>1014</cod_prod>
    <denominacion>HD Caviar Blue 500GB SATA3</denominacion>
    <precio>150</precio>
    <stock_actual>5</stock_actual>
    <stock_minimo>6</stock_minimo>
    <cod_zona>30</cod_zona>
  </producto>
  <producto>
    <cod_prod>1015</cod_prod>
    <denominacion>Tarjeta gráfica Asus GeForce EN210 Silent 1GB</denominacion>
    <precio>40</precio>
    <stock_actual>10</stock_actual>
    <stock_minimo>5</stock_minimo>
    <cod_zona>30</cod_zona>
  </producto>
  <producto>
    <cod_prod>1016</cod_prod>
    <denominacion>Tarjeta gráfica Gigabyte GeForce 1GB</denominacion>
    <precio>50</precio>
    <stock_actual>5</stock_actual>
    <stock_minimo>6</stock_minimo>
    <cod_zona>40</cod_zona>
  </producto>
  <producto>
    <cod_prod>1017</cod_prod>
    <denominacion>Tarjeta gráfica Nvidia Express 1GB</denominacion>
    <precio>45</precio>
    <stock_actual>10</stock_actual>
    <stock_minimo>5</stock_minimo>
    <cod_zona>30</cod_zona>
  </producto>
  <producto>
    <cod_prod>1018</cod_prod>
    <denominacion>Micro Intel Dual Core G620</denominacion>
    <precio>60</precio>
    <stock_actual>15</stock_actual>
    <stock_minimo>5</stock_minimo>
    <cod_zona>40</cod_zona>
  </producto>
  <producto>
    <cod_prod>1019</cod_prod>
    <denominacion>Memoria DDR3 G.Skill 2GB</denominacion>
    <precio>10</precio>
    <stock_actual>5</stock_actual>
    <stock_minimo>3</stock_minimo>
    <cod_zona>10</cod_zona>
  </producto>
  <producto>
      <cod_prod>1020</cod_prod>
      <denominacion>Memoria DDR3 G.Skill 4GB</denominacion>
      <precio>30</precio>
      <stock_actual>30</stock_actual>
      <stock_minimo>10</stock_minimo>
      <cod_zona>10</cod_zona>
  </producto>
  <producto>
    <cod_prod>1021</cod_prod>
    <denominacion>Memoria DDR3 Kingston HyperX 4GB</denominacion>
    <precio>16</precio>
    <stock_actual>15</stock_actual>
    <stock_minimo>4</stock_minimo>
    <cod_zona>20</cod_zona>
  </producto>
  <producto>
  <cod_prod>1022</cod_prod>
    <denominacion>Placa Base ASRock G41M-S3 </denominacion>
    <precio>52</precio>
    <stock_actual>2</stock_actual>
    <stock_minimo>2</stock_minimo>
    <cod_zona>30</cod_zona>
  </producto>
</productos>

我想将“面额”相同的“productos”放入标签内。例如:

<placas> Placa Base MSI G41M-P26 Placa Base ASRock G41M-S3 </placas>
<micros> Micro Intel Core i5-2320 Micro Intel Core i5 2500 Micro Intel Dual Core G620 </micros>

除了以“HD”和“Tarjeta”开头的那些(必须在标签内:“otros”)。 这是我所做的一个示例:

for $productos in doc("productos.xml")/productos/producto
let $agrupacion := $productos/substring-before(data(denominacion),' ')
group by $agrupacion
order by $agrupacion
return if (contains($agrupacion,'Placa'))
then <placa>{data($productos/denominacion)}</placa>
else if (contains($agrupacion,'Micro'))
then <micro>{data($productos/denominacion)}</micro>
else if (contains($agrupacion,'Memoria'))
then <memoria>{data($productos/denominacion)}</memoria>
else <otros>{data($productos/denominacion)}</otros>

提前致谢。

【问题讨论】:

    标签: xml xquery flwor


    【解决方案1】:

    以下使用一个简单的函数将面额映射到字符串/元素名称,然后进行分组:

    declare function local:map ($denominacion as xs:string) as xs:string {
      if (contains($denominacion, 'Placa'))
      then 'placa'
      else if (contains($denominacion, 'Memoria'))
      then 'memoria'
      else if (contains($denominacion, 'Micro'))
      then "micro"
      else 'otros'
     };
    
    for $producto in /productos/producto
    group by $denominacion := local:map($producto/denominacion)
    order by $denominacion
    return element {$denominacion} {$producto/denominacion/data()}
    

    我就是这样得到的

    <memoria>Memoria DDR3 G.Skill 2GB Memoria DDR3 G.Skill 4GB Memoria DDR3 Kingston HyperX 4GB</memoria>
    <micro>Micro Intel Core i5-2320 Micro Intel Core i5 2500 Micro Intel Dual Core G620</micro>
    <otros>HD Seagate Barracuda 250GB SATA HD Caviar Blue 500GB SATA3 Tarjeta gráfica Asus GeForce EN210 Silent 1GB Tarjeta gráfica Gigabyte GeForce 1GB Tarjeta gráfica Nvidia Express 1GB</otros>
    <placa>Placa Base MSI G41M-P26 Placa Base ASRock G41M-S3 </placa>
    

    【讨论】:

    • 如果每个组都在各自的标签内就好了。
    • 我已经添加了我得到的结果,如果这不是你想要的,那么编辑你的问题来解释并详细显示你想要的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多