Как объединить всех дочерних элементов двух пиров в один узел XML? - PullRequest
0 голосов
/ 13 февраля 2020

У меня три XML файла, объединенные в один, так что это выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<Root>
    <wd:Report_Data xmlns:wd="urn:com.workday/bsvc">
        <wd:Report_Entry>
            <wd:RBO_Group>
                <wd:Comment_BatchID>kns_timeoff20200105_5365_78659138</wd:Comment_BatchID>
                <wd:Date_Worked>2020-01-02</wd:Date_Worked>
                <wd:Hours>9</wd:Hours>
                <wd:Type>Vacation</wd:Type>
                <wd:Process_Date>2020-02-10</wd:Process_Date>
            </wd:RBO_Group>
            <wd:Employee_ID>106060</wd:Employee_ID>
        </wd:Report_Entry>
    </wd:Report_Data>
    <wd:Report_Data xmlns:wd="urn:com.workday/bsvc">
        <wd:Report_Entry>
            <wd:RBO_Group>
                <wd:Date_Worked>2014-12-15</wd:Date_Worked>
                <wd:Hours>41.53</wd:Hours>
                <wd:Type>UNITWAY</wd:Type>
                <wd:Process_Date>2019-09-20</wd:Process_Date>
            </wd:RBO_Group>
            <wd:RBO_Group>
                <wd:Date_Worked>2019-08-04</wd:Date_Worked>
                <wd:Hours>5065.84</wd:Hours>
                <wd:Type>zzzdnu BEREAVEWK2</wd:Type>
                <wd:Process_Date>2019-09-24</wd:Process_Date>
            </wd:RBO_Group>
        </wd:Report_Entry>
    </wd:Report_Data>
    <Data>
        <Worker>
            <INT_ID>228606</INT_ID>
            <WD_BATCH_ID>kns_timeoff20191229_232_78652526</WD_BATCH_ID>
            <WD_PAY_INPUT_ID>228602</WD_PAY_INPUT_ID>
            <DATE_WORKED>2019-12-12</DATE_WORKED>
            <EMPLOYEE_ID>146379</EMPLOYEE_ID>
            <WEEK_END_DATE>2019-12-15</WEEK_END_DATE>
            <EFFECTIVE_DATE>2019-12-29</EFFECTIVE_DATE>
            <HOURS>8</HOURS>
            <PAY_COMPONENT>Jury Duty</PAY_COMPONENT>
            <TK_COMMENTS>kns_wd20191229_232_78652526</TK_COMMENTS>
            <SS_REQUEST_ID>78652508</SS_REQUEST_ID>
            <REQUEST_ID>78652526</REQUEST_ID>
            <PROCESS_DATE>2/6/2020 20:57</PROCESS_DATE>
            <PROCESS_STATUS>C</PROCESS_STATUS>
        </Worker>
    </Data>
</Root>

И я хочу объединить все дочерние элементы двух <wd:Report_Data> узлов, чтобы они все под тем же <wd:Report_Data> узлом. Например:

<?xml version="1.0" encoding="utf-8"?>
<Root>
    <wd:Report_Data xmlns:wd="urn:com.workday/bsvc">
        <wd:Report_Entry>
            <wd:RBO_Group>
                <wd:Comment_BatchID>kns_timeoff20200105_5365_78659138</wd:Comment_BatchID>
                <wd:Date_Worked>2020-01-02</wd:Date_Worked>
                <wd:Hours>9</wd:Hours>
                <wd:Type>Vacation</wd:Type>
                <wd:Process_Date>2020-02-10</wd:Process_Date>
            </wd:RBO_Group>
            <wd:Employee_ID>106060</wd:Employee_ID>
        </wd:Report_Entry>
        <wd:Report_Entry>
            <wd:RBO_Group>
                <wd:Date_Worked>2014-12-15</wd:Date_Worked>
                <wd:Hours>41.53</wd:Hours>
                <wd:Type>UNITWAY</wd:Type>
                <wd:Process_Date>2019-09-20</wd:Process_Date>
            </wd:RBO_Group>
            <wd:RBO_Group>
                <wd:Date_Worked>2019-08-04</wd:Date_Worked>
                <wd:Hours>5065.84</wd:Hours>
                <wd:Type>zzzdnu BEREAVEWK2</wd:Type>
                <wd:Process_Date>2019-09-24</wd:Process_Date>
            </wd:RBO_Group>
        </wd:Report_Entry>
    </wd:Report_Data>
    <Data>
        <Worker>
            <INT_ID>228606</INT_ID>
            <WD_BATCH_ID>kns_timeoff20191229_232_78652526</WD_BATCH_ID>
            <WD_PAY_INPUT_ID>228602</WD_PAY_INPUT_ID>
            <DATE_WORKED>2019-12-12</DATE_WORKED>
            <EMPLOYEE_ID>146379</EMPLOYEE_ID>
            <WEEK_END_DATE>2019-12-15</WEEK_END_DATE>
            <EFFECTIVE_DATE>2019-12-29</EFFECTIVE_DATE>
            <HOURS>8</HOURS>
            <PAY_COMPONENT>Jury Duty</PAY_COMPONENT>
            <TK_COMMENTS>kns_wd20191229_232_78652526</TK_COMMENTS>
            <SS_REQUEST_ID>78652508</SS_REQUEST_ID>
            <REQUEST_ID>78652526</REQUEST_ID>
            <PROCESS_DATE>2/6/2020 20:57</PROCESS_DATE>
            <PROCESS_STATUS>C</PROCESS_STATUS>
        </Worker>
    </Data>
</Root>

Но важно, чтобы узел Data оставался отдельным. Какой самый простой способ для меня скопировать XML и просто удалить эти две строки, чтобы все «wd: Report_Entry» находились в одном узле?

Я пробовал это:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:wd="urn:com.workday/bsvc">
    <xsl:output method="xml" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*" />

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

    <xsl:template match="wd:Report_Data/wd:Report_Entry">
           <xsl:copy-of select="//wd:Report_Entry"/>
    </xsl:template>
</xsl:stylesheet>

... который ПОЧТИ работает. Он помещает все узлы Report_Entry под одним и тем же родителем, но дублирует второй узел Report_Entry со всеми его дочерними элементами. Похоже, я должен быть в состоянии квалифицировать выбор с помощью [1], но я не знаю, как бы я сделал этот выбор, чтобы применить шаблон, без шаблона по умолчанию, выбирающего второй узел Report_Data ...

Есть предложения?

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Я считаю, что самый простой способ был бы:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wd="urn:com.workday/bsvc">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/Root">
    <xsl:copy>
        <wd:Report_Data>
             <xsl:copy-of select="wd:Report_Data/wd:Report_Entry"/>
        </wd:Report_Data>
        <xsl:copy-of select="Data"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

Вывод - это не то, что вы показываете, а то, что вы описываете.

0 голосов
/ 13 февраля 2020

Пожалуйста, проверьте этот код:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:wd="urn:com.workday/bsvc">
    <xsl:output method="xml" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*" />
    <xsl:output indent="true"></xsl:output>
    <!-- Identity template -->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="wd:Report_Data/wd:Report_Entry[not(preceding::wd:Report_Entry)]">
        <xsl:copy-of select="//wd:Report_Entry"/>
    </xsl:template>

    <xsl:template match="wd:Report_Entry"/>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...