使用XSL

时间:2019-03-07 09:36:01

标签: xml ms-access xslt

我想使用XSL将XML输入(文件)转换为ACCESS输出(表)。 我拥有的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 个答案:

答案 0 :(得分:1)

您必须为每个节点定义模板规则,以分别处理它们。

<?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>

HeaderTrailer应该被忽略。

<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>