Преобразование входных XML-данных (файлов) в выходные данные ACCESS (таблицы) с использованием XSL - PullRequest
2 голосов
/ 07 марта 2019

Я хочу преобразовать входы XML (файлы) в выходы ACCESS (таблица), используя XSL.XML-файлы, которые у меня есть, выглядят так:

<?xml version="1.0"?>
<ZBE14_OEMs_ItemUpdate_IN>
    <Record>
        <Header>
            <HEAD>HEADOEM</HEAD>
        </Header>
            <ItemMaster>
                <CONO>800</CONO>
                <WHLO>CA</WHLO>
                <STAT>20</STAT>
                <ITNO>PNA</ITNO>
                <SPE3>SPE3 A</SPE3>
                <FRE3>N</FRE3>
                <UNNN>HAZ B</UNNN>
                <HAC1/>
                <HAC2/>
                <ITGR>BAAEAA</ITGR>
                <SPE5/>
                <CSNO>123</CSNO>
                <UNMS>AA</UNMS>
            </ItemMaster>
        <Trailer>
            <TRAIL>TRAILOEM</TRAIL>
        </Trailer>
    </Record>
    <Record>
        <Header>
            <HEAD>HEADOEM</HEAD>
        </Header>
            <ItemMaster>
                <CONO>800</CONO>
                <WHLO>CB</WHLO>
                <STAT>20</STAT>
                <ITNO>PNB</ITNO>
                <SPE3>SPE3 B</SPE3>
                <FRE3>N</FRE3>
                <UNNN>HAZ A</UNNN>
                <HAC1/>
                <HAC2/>
                <ITGR>BAAEAA</ITGR>
                <SPE5/>
                <CSNO>456</CSNO>
                <UNMS>BB</UNMS>
            </ItemMaster>
        <Trailer>
            <TRAIL>TRAILOEM</TRAIL>
        </Trailer>
    </Record>
</ZBE14_OEMs_ItemUpdate_IN>

Меня заинтересовало получение всех данных из раздела <ItemMaster>.Я не знаю, как это сделать, потому что мне мешают теги «Заголовок» и «Трейлер».

Это то, что мне удалось сделать до сих пор:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="ZBE14_OEMs_ItemUpdate_IN/Record/Header/HEAD/ItemMaster/">
    <xsl:copy>
        <xsl:apply-templates select="@*" />
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

Конечно, это не работает, я действительно новичок в XSL, так что, если вы, ребята, могли бы помочь мне, это было бы очень признательно.

Большое спасибо.

1 Ответ

1 голос
/ 07 марта 2019

Вы должны определить правила шаблона для каждого узла, чтобы обрабатывать их индивидуально.

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

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

<xsl:template match="/ZBE14_OEMs_ItemUpdate_IN">
  <import>
    <xsl:apply-templates />
  </import>
</xsl:template>

Вход Record генерирует вывод row для импорта.

<xsl:template match="Record">
  <row>
    <xsl:apply-templates />
  </row>
</xsl:template>

ItemMaster копировать не следует.

<xsl:template match="ItemMaster">
  <xsl:apply-templates />
</xsl:template>

Header и Trailer следует игнорировать.

<xsl:template match="Header|Trailer" />

Все остальное должно быть скопировано.

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

</xsl:stylesheet>

Будет сгенерирован следующий вывод:

<import>
  <row>
    <CONO>800</CONO>
    <WHLO>CA</WHLO>
    <STAT>20</STAT>
    <ITNO>PNA</ITNO>
    <SPE3>SPE3 A</SPE3>
    <FRE3>N</FRE3>
    <UNNN>HAZ B</UNNN>
    <HAC1/>
    <HAC2/>
    <ITGR>BAAEAA</ITGR>
    <SPE5/>
    <CSNO>123</CSNO>
    <UNMS>AA</UNMS>
  </row>
  <row>
    <CONO>800</CONO>
    <WHLO>CB</WHLO>
    <STAT>20</STAT>
    <ITNO>PNB</ITNO>
    <SPE3>SPE3 B</SPE3>
    <FRE3>N</FRE3>
    <UNNN>HAZ A</UNNN>
    <HAC1/>
    <HAC2/>
    <ITGR>BAAEAA</ITGR>
    <SPE5/>
    <CSNO>456</CSNO>
    <UNMS>BB</UNMS>
  </row>
</import>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...