我想使用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的初学者,所以如果你们能帮助我,那将不胜感激。
非常感谢您。
答案 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>
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>