XQuery объединяет два XML-файла - PullRequest
1 голос
/ 15 апреля 2019

В настоящее время есть два XML-файла, и они хотят объединить их для создания 1 XML-файла.

XML 1 (recipes.xml):

<recipes>
    <recipe id="182">
        <name>Hamburger</name>
        <description>Hamburgers are created...</description>
        <chapter>1</chapter>
        <page_number>13</page_number>
    </recipe>
    <recipe id="185">
        <name>Muffins</name>
        <description>Muffins picked with...</description>
        <chapter>2</chapter>
        <page_number>43</page_number>
    </recipe>
<recipes>

XML 2 (ингридиенты.xml):

<ingredients>
    <ingredient id="5">
        <name>Burger Buns</name>
        <recipe_id>182</recipe_id>
        <price>$3.00</price>
        <quantity>13</quantity>
    </ingredient>
    <ingredient id ="111">
        <name>Carrot</name>
        <recipe_id>182</recipe_id>
        <price>2.50</price>
        <quantity>1</quantity>
    </ingredient>
    <ingredient id ="535">
        <name>Blueberry</name>
        <recipe_id>185</recipe_id>
        <price>$5.00</price>
        <quantity>1 Packet of 200 grams</quantity>
    </ingredient>
<ingredients>

И я хочу, чтобы они сочетались с тем, что в рецептах есть такие ингредиенты: Вывод:

<food>
    <recipe id ="182">
        <name>Hamburger</name>
        <description>Hamburgers are created...</description>
        <chapter>1</chapter>
        <page_number>13</page_number>
            <ingredient id ="5">
                <name>Burger Buns</name>
                <price>$3.00</price>
                <quantity>13</quantity>
            </ingredient>
            <ingredient id ="111">
                <name>Carrot</name>
                <price>$2.50</price>
                <quantity>1</quantity>
            </ingredient>
    </recipe>
    <recipe id ="185">
        <name>Muffins</name>
        <description>Muffins picked with...</description>
        <chapter>2</chapter>
        <page_number>43</page_number>
            <ingredient id ="535">
                <name>Blueberry</name>
                <price>$5.00</price>
                <quantity>1 Packet of 200 grams</quantity>
            </ingredient>
    </recipe>
</food>

В настоящее время пытаюсь выполнить слияние в программе под названием BaseX.Я могу выполнять простые запросы, используя один цикл for, но у меня возникают проблемы при объединении двух отдельных документов.

1 Ответ

1 голос
/ 15 апреля 2019

Вы можете просто выбрать элементы из другого документа, которые совпадают по идентификатору, а затем заполнить их:

<food>
{
    for $recipe in recipes/recipe
    let $ingredients := $doc2/ingredients/ingredient[$recipe/@id = recipe_id]
    return
        <recipe>
            {
                $recipe/(@*, *),
                $ingredients/<ingredient>{@*, * except recipe_id }</ingredient>
            }
        </recipe>
}
</food>

Другой документ, который вы можете прочитать как внешнюю переменную или использовать doc('ingredients.xml'), полный пример с внешней переменной (по умолчанию для компактности примера встроенный XML) находится по адресу https://xqueryfiddle.liberty -development.net / 6qM2e2j

...