2016-10-21 2 views
1

Я использую XQuery для передачи множества XML-файлов и извлечения индексированных терминов и преобразования их в операторы вставки SQL. Это очень просто:XQuery для генерации отчета DROP TABLE IF EXISTS + INSERT INTO

xquery version "3.0"; 
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization"; 
declare option output:method "text"; 
for $index in collection(/db/letters/)//index/text() 
return 
    concat("INSERT INTO `indices` SET index='", $index, "';") 

Это порождает такие заявления:

INSERT INTO `indices` SET index='foo'; 
INSERT INTO `indices` SET index='bar'; 

, который все хорошо и денди. Но я хотел бы вывести текст раз перед тем и один раз после всех этих заявлений, а именно, во-первых:

SET NAMES utf8; 
SET FOREIGN_KEY_CHECKS = 0; 

-- ---------------------------- 
-- Table structure for `indices` 
-- ---------------------------- 
DROP TABLE IF EXISTS `indices`; 
CREATE TABLE `indices` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `norm` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=COMPACT; 

и, в конце концов,

SET FOREIGN_KEY_CHECKS = 1;" 

В PHP это будет но в XQuery это намного сложнее, особенно для таких не продвинутых пользователей, как я.

Выражения FLOWR кажутся очень легкими и логичными при выводе XML, но я не могу понять, как выполнить кумулятивный возврат с двумя другими строками.

Любые указатели будут тепло оценены.

ответ

2

Я использую XQuery для этого часто. Иногда полезно помнить, что XQuery действительно все о последовательностях и что выражения FLOWR - всего лишь один из способов генерации последовательности. Существует несколько способов добиться того, что вы пытаетесь сделать. Ниже приводятся примеры.

xquery version "3.0"; 
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization"; 
declare option output:method "text"; 
let $newline := '
' 
let $beginning := 
    ("your first line", 
     "your second line", 
     "your third line", 
     ...) 
let $middle := 
    for $index in collection(/db/letters/)//index/text() 
    return concat("INSERT INTO `indices` SET index='", $index, "';") 
let $end := ("your first end line", "your second end line", ...) 
return 
    string-join(($beginning, $middle, $end), $newline) 

или аналогичные:

let $newline := '
' 
let $lines := 
(
    ("your first line", 
     "your second line", 
     "your third line", 
     ...), 
    (for $index in collection(/db/letters/)//index/text() 
    return concat("INSERT INTO `indices` SET index='", $index, "';") 
    ), 
    ("your first end line", "your second end line", ...) 
) 
return string-join($lines, $newline) 

или некоторые процессоры позволяют создавать текстовые узлы, используя синтаксис таким образом, что ваш запрос может произвести последовательность текстовых узлов с символом новой строки в конце каждого из них. Хотя, пожалуйста, обратите внимание, что последовательность внутри текста {} может быть выведена отдельно от вкладок, поэтому в приведенном ниже примере может быть вкладка перед новой строкой. Это можно преодолеть с помощью concat() всего в текстовом {} узле.

let $newline := '
' 
return 
( text{ 'your first line', $newline }, 
    text{ 'your second line', $newline }, 
    text{ '...', $newline }, 
    (for $index in collection(/db/letters/)//index/text() 
    return text{concat("INSERT INTO `indices` SET index='", $index, "';"),$newline} 
    ), 
    text {"your first end line", $newline }, 
    text {"your second end line", $newline }, 
    ... 
) 
+0

совершенный. большое спасибо, Дэвид! – Tench

Смежные вопросы