![](/img/trans.png)
[英]Importing xml with nested nodes into Access (and needing to transform the xml into a 'flat' structure with xsl)
[英]Importing XML into Access with an XSL transform
我还看到了其他一些类似答案的答案,但是我无法完全解决。 我有一个以属性为中心的XML文件,需要将其导入Access中,该文件仅接受以元素为中心的格式。 似乎我需要对XSL文件进行转换,但是我不清楚如何进行转换。 由于数据是专有的,因此我以科幻为主题对其进行了伪装。 我需要做的是将第一个代码示例转换为与第二个示例相同的格式:
<PLANETARY Protocol="Solar 1">
<COLONIES>
<COLONYDATA site="10001" planet="Mars">
<RESOURCEDATA resource="RadiationDanger" value="Low" />
<RESOURCEDATA resource="ApplicantColonists" value="11" />
<RESOURCEDATA resource="AcceptedColonists" value="3" />
</COLONYDATA>
<COLONYDATA site="10002" planet="Mars">
<RESOURCEDATA resource="RadiationDanger" value="Low" />
<RESOURCEDATA resource="ApplicantColonists" value="7" />
<RESOURCEDATA resource="AcceptedColonists" value="1" />
</COLONYDATA>
<COLONYDATA site="11019" planet="Titan">
<RESOURCEDATA resource="RadiationDanger" value="Low" />
<RESOURCEDATA resource="ApplicantColonists" value="22" />
<RESOURCEDATA resource="AcceptedColonists" value="16" />
</COLONYDATA>
</COLONIES>
</PLANETARY>
<Protocol>
Solar1
<COLONIES>
<COLONYDATA>
<site>10001</site>
<planet>Mars</planet>
<RadiationDanger>Low</RadiationDanger>
<ApplicantColonists>11</ApplicantColonists>
<AcceptedColonists>3</AcceptedColonists>
</COLONYDATA>
<COLONYDATA>
<site>10002</site>
<planet>Mars</planet>
<RadiationDanger>Low</RadiationDanger>
<ApplicantColonists>7</ApplicantColonists>
<AcceptedColonists>1</AcceptedColonists>
</COLONYDATA>
<COLONYDATA>
<site>11019</site>
<planet>Titan</planet>
<RadiationDanger>Low</RadiationDanger>
<ApplicantColonists>22</ApplicantColonists>
<AcceptedColonists>16</AcceptedColonists>
</COLONYDATA>
</COLONIES>
</Protocol>
任何帮助,将不胜感激。 谢谢!
试试这个XSLT。 根据您的转换需求定义匹配RESOURCEDATA
和PLANETARY
templates
:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*" >
<xsl:element name="{name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/PLANETARY">
<Protocol>
<xsl:value-of select="@Protocol"/>
<xsl:apply-templates select="node()"/>
</Protocol>
</xsl:template>
<xsl:template match="RESOURCEDATA">
<xsl:element name="{@resource}">
<xsl:value-of select="@value"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
第三个模板<xsl:template match="/PLANETARY">
创建一个Protocol
元素,添加@Protocol
值,并将模板应用于其节点(即,在本例中,将模板应用于其子元素)。
所述fouth模板<xsl:template match="RESOURCEDATA">
创建具有名称作为元素@resource
的值,并且从值@value
。
来到前两个模板,当第一个模板( <xsl:template match="@*" >
)应用于任何属性时,会将其转换为元素(以元素为中心)。
第二个模板<xsl:template match="@*" >
匹配节点(在您的情况下为元素),复制标签,并为其属性和子元素应用模板(以递归方式)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.