Конвертировать XML в XML для каждого элемента - PullRequest
0 голосов
/ 13 декабря 2018

Добрый день, я очень новичок в XML и XSLT, и я пытаюсь преобразовать первый XML ниже, во второй XML ниже.Любая помощь будет оценена.XML предназначен для канала данных, поэтому он должен оставаться в том же формате, что и оригинал, но мне нужно создать отдельный «элемент» для каждого «Document_to_be_Requested» в соответствии с «Questionnaire_ID».

ОРИГИНАЛ

<?xml version="1.0" encoding="utf-8"?>
<ex:Record xmlns:ex="http://archertech.com/Print/Export">

    <ex:Item>
        <ex:Questionnaire_ID>1007</ex:Questionnaire_ID>
        <ex:Target>
            <ex:Item>Company 1</ex:Item>
        </ex:Target>
        <ex:Document_to_be_Requested>
            <ex:Item>A</ex:Item>
            <ex:Item>C</ex:Item>
            <ex:Item>D</ex:Item>
            <ex:Item>F</ex:Item>
        </ex:Document_to_be_Requested>
    </ex:Item>

    <ex:Item>
        <ex:Questionnaire_ID>1009</ex:Questionnaire_ID>
        <ex:Target>
            <ex:Item>Company 2</ex:Item>
        </ex:Target>
        <ex:Document_to_be_Requested>
            <ex:Item>A</ex:Item>
            <ex:Item>B</ex:Item>
            <ex:Item>F</ex:Item>
            <ex:Item>G</ex:Item>
        </ex:Document_to_be_Requested>
    </ex:Item>
</ex:Record>

ЖЕЛАЕТ

<?xml version="1.0" encoding="utf-8"?>
<ex:Record xmlns:ex="http://archertech.com/Print/Export">

<ex:Item>
    <ex:Questionnaire_ID>1007</ex:Questionnaire_ID>
    <ex:Target>
        <ex:Item>Company 1</ex:Item>
    </ex:Target>
    <ex:Document_to_be_Requested>
        <ex:Item>A</ex:Item>
    </ex:Document_to_be_Requested>
</ex:Item>

<ex:Item>
    <ex:Questionnaire_ID>1007</ex:Questionnaire_ID>
    <ex:Target>
        <ex:Item>Company 1</ex:Item>
    </ex:Target>
    <ex:Document_to_be_Requested>
        <ex:Item>C</ex:Item>
    </ex:Document_to_be_Requested>
</ex:Item>

<ex:Item>
    <ex:Questionnaire_ID>1007</ex:Questionnaire_ID>
    <ex:Target>
        <ex:Item>Company 1</ex:Item>
    </ex:Target>
    <ex:Document_to_be_Requested>
        <ex:Item>D</ex:Item>
    </ex:Document_to_be_Requested>
</ex:Item>

<ex:Item>
    <ex:Questionnaire_ID>1007</ex:Questionnaire_ID>
    <ex:Target>
        <ex:Item>Company 1</ex:Item>
    </ex:Target>
    <ex:Document_to_be_Requested>
        <ex:Item>F</ex:Item>
    </ex:Document_to_be_Requested>
</ex:Item>


<ex:Item>
    <ex:Questionnaire_ID>1009</ex:Questionnaire_ID>
    <ex:Target>
        <ex:Item>Company 2</ex:Item>
    </ex:Target>
    <ex:Document_to_be_Requested>
        <ex:Item>A</ex:Item>
    </ex:Document_to_be_Requested>
</ex:Item>

<ex:Item>
    <ex:Questionnaire_ID>1009</ex:Questionnaire_ID>
    <ex:Target>
        <ex:Item>Company 2</ex:Item>
    </ex:Target>
    <ex:Document_to_be_Requested>
        <ex:Item>B</ex:Item>
    </ex:Document_to_be_Requested>
</ex:Item>

<ex:Item>
    <ex:Questionnaire_ID>1009</ex:Questionnaire_ID>
    <ex:Target>
        <ex:Item>Company 2</ex:Item>
    </ex:Target>
    <ex:Document_to_be_Requested>
        <ex:Item>F</ex:Item>
    </ex:Document_to_be_Requested>
</ex:Item>

<ex:Item>
    <ex:Questionnaire_ID>1009</ex:Questionnaire_ID>
    <ex:Target>
        <ex:Item>Company 2</ex:Item>
    </ex:Target>
    <ex:Document_to_be_Requested>
        <ex:Item>G</ex:Item>
    </ex:Document_to_be_Requested>
</ex:Item>


</ex:Record>

Заранее спасибо!

1 Ответ

0 голосов
/ 14 декабря 2018

Начните с шаблона идентификатора

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

Затем укажите шаблон для узла ex:Record/ex:Item.Применение только целевых узлов.

<xsl:template match="ex:Record/ex:Item">
    <xsl:apply-templates select="ex:Document_to_be_Requested/*"/>
</xsl:template>

Затем шаблон для целевого узла

<xsl:template match="ex:Document_to_be_Requested/ex:Item">
    <ex:Item>
        <!-- copies the preceding siblings of parent node -->
        <xsl:copy-of select="../preceding-sibling::*"/>
        <ex:Document_to_be_Requested>
            <!-- copies the current node -->
            <xsl:copy-of select="."/>
        </ex:Document_to_be_Requested>
    </ex:Item>
</xsl:template>

Вся таблица стилей выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ex="http://archertech.com/Print/Export"
    version="2.0">

    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="ex:Record/ex:Item">
        <xsl:apply-templates select="ex:Document_to_be_Requested/*"/>
    </xsl:template>

    <xsl:template match="ex:Document_to_be_Requested/ex:Item">
        <ex:Item>
            <xsl:copy-of select="../preceding-sibling::*"/>
            <ex:Document_to_be_Requested>
                <xsl:copy-of select="."/>
            </ex:Document_to_be_Requested>
        </ex:Item>
    </xsl:template>

</xsl:stylesheet>

Смотрите его в действии здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...