/ / Importowanie XML do programu Access za pośrednictwem XSL z powtarzającą się notatką nadrzędną z węzłami potomnymi - xml, ms-access, xslt

Importowanie XML-a do programu Access za pomocą XSL z natywną powtarzaniem notatek z węzłami potomnymi - xml, ms-access, xslt

Próbuję zaimportować XML zorientowany na atrybutyplik do programu Access za pomocą transformacji XSL. To, co musi się wydarzyć, to coś w stylu konwersji (przebranej, by nie naruszać zasad firmy):

<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>
</COLONIES>
</PLANETARY>

Zaangażowany w to:

<Protocol>
<COLONIES>
<COLONYDATA>
<protocol>10002</protocol>
<site>10001</site>
<planet>Mars</planet>
<RadiationDanger>Low</RadiationDanger>
<ApplicantColonists>11</ApplicantColonists>
<AcceptedColonists>3</AcceptedColonists>
</COLONYDATA>
<COLONYDATA>
<protocol>10002</protocol>
<site>10002</site>
<planet>Mars</planet>
<RadiationDanger>Low</RadiationDanger>
<ApplicantColonists>7</ApplicantColonists>
<AcceptedColonists>1</AcceptedColonists>
</COLONYDATA>
</COLONIES>
</Protocol>

Ostatecznie naprawdę potrzebuję, aby tabela w programie Access wyglądała w ten sposób, konwersja XML na to, co mam powyżej, może być optymalną trasą, ale może nie działać:

protocol    site    planet  RadiationDanger ApplicantColonists  AcceptedColonists
Solar1      10001   Mars    Low             11                  3
Solar1      10002   Mars    Low             7                   1

Święty Lingamurthy dał mi następujący kod, który robi wszystko oprócz tego, aby węzeł nadrzędny powtarzał się wraz z węzłami potomnymi (głównie dlatego, że nie wiedziałem, że go wtedy potrzebowałem):

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

Jeśli to możliwe, chciałbym zrozumieć, jak to jestpracujący. Muszę przyznać, że w tym momencie XSLT nie ma dla mnie większego sensu. Jest trochę bardziej abstrakcyjny niż VBA, z którym czuję się bardzo dobrze. Ale byłbym zadowolony z każdej sugestii to sprawia, że ​​działa. Dzięki!

Odpowiedzi:

2 dla odpowiedzi № 1

Nie jestem tego taki pewien, ale myślę, że chcesz PLANETARY/@Protocol w każdym COLONYDATA a nie site”. A jak chcesz mieć inne wyjście (jak w tabeli)? Czy chcesz używać kodu HTML do wyświetlania w przeglądarce, czy chcesz, aby był to zwykły tekst?

<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:variable name="Protocol" select="/PLANETARY/@Protocol"/>

<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: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:template match="COLONYDATA">
<xsl:copy>
<Protocol>
<xsl:value-of select="$Protocol"/>
</Protocol>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>

</xsl:stylesheet>