Запрос типа удаления Xquery с использованием списка поиска - PullRequest
0 голосов
/ 30 октября 2011

Нужна помощь при создании xquery для удаления данных из XML-файла, который содержит данные для фида данных продуктов Google.

У меня есть длинный список идентификационных номеров в столбце электронной таблицы, которые необходимо удалить - они числовые.

Ниже приведена схема XML.Мне нужно выбрать все записи, где <g:id> = "моя строка чисел", а затем удалить их из файла.

Спасибо за помощь!

<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">
 <channel>
   <title></title>
   <link></link>
   <description></description>
  <item> 
    <title></title>
    <link></link>
    <description></description>
    <g:id></g:id>
    <g:condition></g:condition>
    <g:price></g:price>
    <g:availability></g:availability>
    <g:image_link></g:image_link>
    <g:brand></g:brand>
    <g:mpn></g:mpn>
    <g:product_type></g:product_type>
  </item>
 </channel>
</rss>

Ответы [ 2 ]

1 голос
/ 30 октября 2011

Этот XQuery :

declare namespace g = "http://base.google.com/ns/1.0";

<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">
  <channel>
  {
    let $vIds := (1,3)
     return
       /*/*/*[not(g:id = $vIds)]
   }
  </channel>
</rss>  

при применении к предоставленному документу XML :

  <rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">
  <channel>
    <title></title>
    <link></link>
    <description></description>
    <item> 
      <title>Item 1</title>
      <link></link>
      <description></description>
      <g:id>1</g:id>
      <g:condition></g:condition>
      <g:price></g:price>
      <g:availability></g:availability>
      <g:image_link></g:image_link>
      <g:brand></g:brand>
      <g:mpn></g:mpn>
      <g:product_type></g:product_type>
    </item>
    <item> 
      <title>Item 2</title>
      <link></link>
      <description></description>
      <g:id>2</g:id>
      <g:condition></g:condition>
      <g:price></g:price>
      <g:availability></g:availability>
      <g:image_link></g:image_link>
      <g:brand></g:brand>
      <g:mpn></g:mpn>
      <g:product_type></g:product_type>
    </item>
    <item> 
      <title>Item 3</title>
      <link></link>
      <description></description>
      <g:id>3</g:id>
      <g:condition></g:condition>
      <g:price></g:price>
      <g:availability></g:availability>
      <g:image_link></g:image_link>
      <g:brand></g:brand>
      <g:mpn></g:mpn>
      <g:product_type></g:product_type>
    </item>
  </channel>
</rss>

создает искомый, правильный результат :

<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:g="http://base.google.com/ns/1.0" version="2.0">
   <channel>
      <title/>
      <link/>
      <description/>
      <item> 
         <title>Item 2</title>
         <link/>
         <description/>
         <g:id>2</g:id>
         <g:condition/>
         <g:price/>
         <g:availability/>
         <g:image_link/>
         <g:brand/>
         <g:mpn/>
         <g:product_type/>
      </item>
   </channel>
</rss>
1 голос
/ 30 октября 2011

Используйте функцию XQuery-Update delete

delete node doc("mydata.xml")//item[g:id = (1, 3, 5, 6, 8, 9, 12)]

Если вы не хотите прикасаться к исходным данным, используйте modify.

copy $c := doc("mydata.xml")/
modify delete node $c//item[g:id = (1, 3, 5, 6, 8, 9, 12)]
return $c

= сравнивается с некоторой семантикой набора, возвращает true, если один из элементов слева равен единице справа.

...