2016-04-10 1 views
0

Ich versuche, eine Datei submission.xml aus einer ODK-Umfrage in Access zu importieren. Ich verwende die "XML-Import" -Funktion in MS Access und muss die Daten so transformieren, dass jeder Datensatz eines Knotens, der in eine Tabelle importiert wird, die ID der Umfrage enthält.Importieren von ODK XML-Datei in MS Access mit XLST-Transformation

Ich habe eine XML mit der Befragungsdaten, die wie folgt aussieht:

<SoLa_Tu_Insp_2016-03-13 id="SOLA-160313" 
    instanceID="uuid:63c27738-df02-4298-9090-7ab96d4e1ab2" 
    submissionDate="2016-04-08T02:11:47.600Z" 
    isComplete="true" 
    markedAsCompleteDate="2016-04-08T02:13:12.322Z" 
    xmlns="http://opendatakit.org/submissions"> 
<start>2016-04-08T23:47:50.615Z</start> 
<end>2016-04-08T02:11:30.954Z</end> 
<deviceid>353375050176865</deviceid> 
<telnr /> 
<insp> 
    <objekt>25</objekt> 
    <objdel>212</objdel> 
    <objdel-tx>Bronstunneln</objdel-tx> 
    <datum>2016-04-08</datum> 
    <sign>MFR RLS</sign> 
    <anm>8</anm> 
</insp> 
<skdr> 
    <skd> 
     <metod>100</metod> 
     <ts> 
      <ts-nr>523</ts-nr> 
      <ts-typskada>Lucka - L&#246;s - Takelement</ts-typskada> 
      <ts-kdel>15</ts-kdel> 
      <ts-kelem>1530</ts-kelem> 
      <ts-mtrl>13</ts-mtrl> 
      <ts-typ>35</ts-typ> 
      <ts-orsak>999</ts-orsak> 
      <ts-aktivitet>87</ts-aktivitet> 
      <ts-enhet>st</ts-enhet> 
      <ts-aktivitet-tx>&#197;tdragning</ts-aktivitet-tx> 
      <ts-mangd>1.0000000000</ts-mangd> 
     </ts> 
     <ovr> 
      <ovr-kdel /> 
      <ovr-kdel-tx /> 
      <ovr-kelem /> 
      <ovr-kelem-tx /> 
      <ovr-mtrl /> 
      <ovr-mtrl-tx /> 
      <ovr-typ /> 
      <ovr-typ-tx /> 
      <ovr-orsak /> 
      <ovr-aktivitet /> 
      <ovr-aktivitet-tx /> 
      <ovr-enhet /> 
      <ovr-mangd /> 
     </ovr> 
     <kdel>15</kdel> 
     <kelem>1530</kelem> 
     <mtrl>13</mtrl> 
     <typ>35</typ> 
     <orsak>999</orsak> 
     <skd-tx>G&#229;ng/inspektionsbrygga etc/Lucka/d&#246;rr/Rostfritt st&#229;l/L&#246;s/&#214;vrigt</skd-tx> 
     <tk>3</tk> 
     <anm>Luckan h&#229;ller p&#229; att ramla av</anm> 
     <aktivitet>87</aktivitet> 
     <mangd>1</mangd> 
     <enhet>st</enhet> 
     <sekt1>675</sekt1> 
     <sekt2 /> 
     <lage>VT</lage> 
     <lage-tx /> 
     <bildskada>1460073108135.jpg</bildskada> 
     <bildnr /> 
    </skd> 
    <skd> 
     <metod>100</metod> 
     <ts> 
      <ts-nr>321</ts-nr> 
      <ts-typskada>f.a. sprutbetong - L&#228;ckage - Tak</ts-typskada> 
      <ts-kdel>6</ts-kdel> 
      <ts-kelem>665</ts-kelem> 
      <ts-mtrl>6</ts-mtrl> 
      <ts-typ>50</ts-typ> 
      <ts-orsak>129</ts-orsak> 
      <ts-aktivitet>45</ts-aktivitet> 
      <ts-enhet>kg</ts-enhet> 
      <ts-aktivitet-tx>Injektering</ts-aktivitet-tx> 
      <ts-mangd>5.0000000000</ts-mangd> 
     </ts> 
     <ovr> 
      <ovr-kdel /> 
      <ovr-kdel-tx /> 
      <ovr-kelem /> 
      <ovr-kelem-tx /> 
      <ovr-mtrl /> 
      <ovr-mtrl-tx /> 
      <ovr-typ /> 
      <ovr-typ-tx /> 
      <ovr-orsak /> 
      <ovr-aktivitet /> 
      <ovr-aktivitet-tx /> 
      <ovr-enhet /> 
      <ovr-mangd /> 
     </ovr> 
     <kdel>6</kdel> 
     <kelem>665</kelem> 
     <mtrl>6</mtrl> 
     <typ>50</typ> 
     <orsak>129</orsak> 
     <skd-tx>Huvudb&#228;rverk/Tak ytf&#246;rst&#228;rkning/Fiberarmerad sprutbetong/L&#228;ckage/Vatten</skd-tx> 
     <tk>2</tk> 
     <anm>3/s</anm> 
     <aktivitet>45</aktivitet> 
     <mangd>5</mangd> 
     <enhet>kg</enhet> 
     <sekt1>694</sekt1> 
     <sekt2>694</sekt2> 
     <lage>CT</lage> 
     <lage-tx>Kalk, j&#228;rn,mangan utf&#228;lning droppar rikligt</lage-tx> 
     <bildskada /> 
     <bildnr>4517</bildnr> 
    </skd> 
    <skd> 
     <metod>100</metod> 
     <ts> 
      <ts-nr>321</ts-nr> 
      <ts-typskada>f.a. sprutbetong - L&#228;ckage - Tak</ts-typskada> 
      <ts-kdel>6</ts-kdel> 
      <ts-kelem>665</ts-kelem> 
      <ts-mtrl>6</ts-mtrl> 
      <ts-typ>50</ts-typ> 
      <ts-orsak>129</ts-orsak> 
      <ts-aktivitet>45</ts-aktivitet> 
      <ts-enhet>kg</ts-enhet> 
      <ts-aktivitet-tx>Injektering</ts-aktivitet-tx> 
      <ts-mangd /> 
     </ts> 
     <ovr> 
      <ovr-kdel /> 
      <ovr-kdel-tx /> 
      <ovr-kelem /> 
      <ovr-kelem-tx /> 
      <ovr-mtrl /> 
      <ovr-mtrl-tx /> 
      <ovr-typ /> 
      <ovr-typ-tx /> 
      <ovr-orsak /> 
      <ovr-aktivitet /> 
      <ovr-aktivitet-tx /> 
      <ovr-enhet /> 
      <ovr-mangd /> 
     </ovr> 
     <kdel>6</kdel> 
     <kelem>665</kelem> 
     <mtrl>6</mtrl> 
     <typ>50</typ> 
     <orsak>129</orsak> 
     <skd-tx>Huvudb&#228;rverk/Tak ytf&#246;rst&#228;rkning/Fiberarmerad sprutbetong/L&#228;ckage/Vatten</skd-tx> 
     <tk>1</tk> 
     <anm>Kalk, j&#228;rn,mangan utf&#228;lning</anm> 
     <aktivitet>45</aktivitet> 
     <mangd /> 
     <enhet>kg</enhet> 
     <sekt1>698</sekt1> 
     <sekt2 /> 
     <lage>VT</lage> 
     <lage-tx>8/sek</lage-tx> 
     <bildskada /> 
     <bildnr>4519-4520</bildnr> 
    </skd> 
    <skd> 
     <metod>100</metod> 
     <ts> 
      <ts-nr>513</ts-nr> 
      <ts-typskada>Lucka - Defekt - Takelement</ts-typskada> 
      <ts-kdel>15</ts-kdel> 
      <ts-kelem>1530</ts-kelem> 
      <ts-mtrl>13</ts-mtrl> 
      <ts-typ>48</ts-typ> 
      <ts-orsak>999</ts-orsak> 
      <ts-aktivitet>88</ts-aktivitet> 
      <ts-enhet>st</ts-enhet> 
      <ts-aktivitet-tx>&#214;versyn</ts-aktivitet-tx> 
      <ts-mangd /> 
     </ts> 
     <ovr> 
      <ovr-kdel /> 
      <ovr-kdel-tx /> 
      <ovr-kelem /> 
      <ovr-kelem-tx /> 
      <ovr-mtrl /> 
      <ovr-mtrl-tx /> 
      <ovr-typ /> 
      <ovr-typ-tx /> 
      <ovr-orsak /> 
      <ovr-aktivitet /> 
      <ovr-aktivitet-tx /> 
      <ovr-enhet /> 
      <ovr-mangd /> 
     </ovr> 
     <kdel>15</kdel> 
     <kelem>1530</kelem> 
     <mtrl>13</mtrl> 
     <typ>48</typ> 
     <orsak>999</orsak> 
     <skd-tx>G&#229;ng/inspektionsbrygga etc/Lucka/d&#246;rr/Rostfritt st&#229;l/Defekt/&#214;vrigt</skd-tx> 
     <tk>2</tk> 
     <anm>G&#229;r ej skruva saknas 2st skruvar</anm> 
     <aktivitet>88</aktivitet> 
     <mangd /> 
     <enhet>st</enhet> 
     <sekt1>653</sekt1> 
     <sekt2 /> 
     <lage>HT</lage> 
     <lage-tx>Nya skruvh&#229;l luckan som matchar</lage-tx> 
     <bildskada /> 
     <bildnr>4523-4521</bildnr> 
    </skd> 
    <skd> 
     <metod>100</metod> 
     <ts> 
      <ts-nr>513</ts-nr> 
      <ts-typskada>Lucka - Defekt - Takelement</ts-typskada> 
      <ts-kdel>15</ts-kdel> 
      <ts-kelem>1530</ts-kelem> 
      <ts-mtrl>13</ts-mtrl> 
      <ts-typ>48</ts-typ> 
      <ts-orsak>999</ts-orsak> 
      <ts-aktivitet>88</ts-aktivitet> 
      <ts-enhet>st</ts-enhet> 
      <ts-aktivitet-tx>&#214;versyn</ts-aktivitet-tx> 
      <ts-mangd>1.0000000000</ts-mangd> 
     </ts> 
     <ovr> 
      <ovr-kdel /> 
      <ovr-kdel-tx /> 
      <ovr-kelem /> 
      <ovr-kelem-tx /> 
      <ovr-mtrl /> 
      <ovr-mtrl-tx /> 
      <ovr-typ /> 
      <ovr-typ-tx /> 
      <ovr-orsak /> 
      <ovr-aktivitet /> 
      <ovr-aktivitet-tx /> 
      <ovr-enhet /> 
      <ovr-mangd /> 
     </ovr> 
     <kdel>15</kdel> 
     <kelem>1530</kelem> 
     <mtrl>13</mtrl> 
     <typ>48</typ> 
     <orsak>999</orsak> 
     <skd-tx>G&#229;ng/inspektionsbrygga etc/Lucka/d&#246;rr/Rostfritt st&#229;l/Defekt/&#214;vrigt</skd-tx> 
     <tk>2</tk> 
     <anm>Luckan beh&#246;vs passas om</anm> 
     <aktivitet>88</aktivitet> 
     <mangd>1</mangd> 
     <enhet>st</enhet> 
     <sekt1>681</sekt1> 
     <sekt2 /> 
     <lage>VT</lage> 
     <lage-tx>TV3 tidigare 2 skruv har s&#228;tts men m&#229;det &#229;tg&#228;rdas</lage-tx> 
     <bildskada /> 
     <bildnr>4527</bildnr> 
    </skd> 
    <skd> 
     <metod>100</metod> 
     <ts> 
      <ts-nr>513</ts-nr> 
      <ts-typskada>Lucka - Defekt - Takelement</ts-typskada> 
      <ts-kdel>15</ts-kdel> 
      <ts-kelem>1530</ts-kelem> 
      <ts-mtrl>13</ts-mtrl> 
      <ts-typ>48</ts-typ> 
      <ts-orsak>999</ts-orsak> 
      <ts-aktivitet>88</ts-aktivitet> 
      <ts-enhet>st</ts-enhet> 
      <ts-aktivitet-tx>&#214;versyn</ts-aktivitet-tx> 
      <ts-mangd>1.0000000000</ts-mangd> 
     </ts> 
     <ovr> 
      <ovr-kdel /> 
      <ovr-kdel-tx /> 
      <ovr-kelem /> 
      <ovr-kelem-tx /> 
      <ovr-mtrl /> 
      <ovr-mtrl-tx /> 
      <ovr-typ /> 
      <ovr-typ-tx /> 
      <ovr-orsak /> 
      <ovr-aktivitet /> 
      <ovr-aktivitet-tx /> 
      <ovr-enhet /> 
      <ovr-mangd /> 
     </ovr> 
     <kdel>15</kdel> 
     <kelem>1530</kelem> 
     <mtrl>13</mtrl> 
     <typ>48</typ> 
     <orsak>999</orsak> 
     <skd-tx>G&#229;ng/inspektionsbrygga etc/Lucka/d&#246;rr/Rostfritt st&#229;l/Defekt/&#214;vrigt</skd-tx> 
     <tk>3</tk> 
     <anm /> 
     <aktivitet>88</aktivitet> 
     <mangd>1</mangd> 
     <enhet>st</enhet> 
     <sekt1>710</sekt1> 
     <sekt2 /> 
     <lage>HT</lage> 
     <lage-tx>Nedre skruvh&#229;l passar inte</lage-tx> 
     <bildskada /> 
     <bildnr>4543-4542</bildnr> 
    </skd> 
</skdr> 
<ritningar>212B2B01 212B2B02 212B2B03 212B2B04</ritningar> 
<skd-antal>6</skd-antal> 
<sekt-min>653</sekt-min> 
<sekt-max>710</sekt-max> 
<tk-min>1</tk-min> 
<tk-max>3</tk-max> 
<n0:meta xmlns:n0="http://openrosa.org/xforms"> 
    <n0:instanceID>uuid:63c27738-df02-4298-9090-7ab96d4e1ab2</n0:instanceID> 
    <n0:instanceName>S&#246;L&#228;-25-212-2016-04-08-MFR RLS-4ae669a1-7d89-424a-bfab-26d506da0604</n0:instanceName> 
</n0:meta> 

Bei jedem 'SKD' Knoten I das 'instanceID' Attribut des Root-Element hinzugefügt werden soll, so dass jeder ‚SKD‘ Knoten wird in etwa so aussehen:

<skdr> 
    <skd> 
     <id>uuid:63c27738-df02-4298-9090-7ab96d4e1ab2</id> 
     <metod>100</metod> 

Also, ich versuche diese XSL-Datei für die Transformation verwendet werden, die wie beabsichtigt funktioniert nicht:

xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output indent="yes" encoding="utf-8"/> 
<xsl:strip-space elements="*"/> 

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

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

<xsl:template match="//skd"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
      <ID><xsl-copy-of select="/SoLa_Tu_Insp_2016-03-13/@instanceID"/></ID> 
     <xsl:apply-templates select="node()"/> 
    </xsl:copy> 

</xsl:template> 

Das Ergebnis, das ich bekommen, wenn die obige Transformation ist wie folgt:

<?xml version="1.0" encoding="utf-8"?> 
<dataroot> 
    <SoLa_Tu_Insp_2016-03-13 xmlns="http://opendatakit.org/submissions" id="SOLA-160313" instanceID="uuid:63c27738-df02-4298-9090-7ab96d4e1ab2" submissionDate="2016-04-08T02:11:47.600Z" isComplete="true" markedAsCompleteDate="2016-04-08T02:13:12.322Z"> 
    <start>2016-04-08T23:47:50.615Z</start> 
    <end>2016-04-08T02:11:30.954Z</end> 
    <deviceid>353375050176865</deviceid> 
    <telnr/> 
    <insp> 
     <objekt>25</objekt> 
     <objdel>212</objdel> 
     <objdel-tx>Bronstunneln</objdel-tx> 
     <datum>2016-04-08</datum> 
     <sign>MFR RLS</sign> 
     <anm>8</anm> 
    </insp> 
    <skdr> 
     <skd> 
     <metod>100</metod> 
     <ts> 
      <ts-nr>523</ts-nr> 
      <ts-typskada>Lucka - Lös - Takelement</ts-typskada> 
      <ts-kdel>15</ts-kdel> 
      <ts-kelem>1530</ts-kelem> 
      <ts-mtrl>13</ts-mtrl> 
      <ts-typ>35</ts-typ> 
      <ts-orsak>999</ts-orsak> 
      <ts-aktivitet>87</ts-aktivitet> 
      <ts-enhet>st</ts-enhet> 
      <ts-aktivitet-tx>Åtdragning</ts-aktivitet-tx> 
      <ts-mangd>1.0000000000</ts-mangd> 
     </ts> 

Thers ist kein 'instanceID' an jedem 'SKD' Knoten. Ich habe die XPATHs unter http://www.freeformatter.com/xpath-tester.html getestet und es scheint in Ordnung zu sein.

Hat jemand eine Idee, was ich hier falsch mache?

Antwort

3

Ihre Vorlage tut nicht Spiel das skd Element in dem XML-Quelldokument, weil das Element in einemNamespace ist.

Versuchen Sie es auf diese Weise statt:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:odk="http://opendatakit.org/submissions" 
exclude-result-prefixes="odk"> 
<xsl:output indent="yes" encoding="utf-8"/> 
<xsl:strip-space elements="*"/> 

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

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

<xsl:template match="odk:skd"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <ID xmlns="http://opendatakit.org/submissions"> 
      <xsl:value-of select="/odk:SoLa_Tu_Insp_2016-03-13/@instanceID"/> 
     </ID> 
     <xsl:apply-templates select="node()"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

Zusätzliche Hinweise:

  1. Starten eines Einstimmungsmuster mit // ist überflüssig;
  2. xsl-copy-of ist keine gültige XSLT-Anweisung;
  3. Ihre Version <xsl:apply-templates select="@*|node()"/> hätte die untergeordneten Knoten dupliziert.
+0

Danke eine Million Michael! Als Neuling auf XSLT machte mich das verrückt ... Ich bekomme jetzt den Output, den ich will. – Sid