XSLT -inläsning fråga: importera allt i rätt ordning till 1 fält?

Tråden skapades och har fått 9 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • Stockholm
  • 2011-01-22 17:29

Och gud vad man lär sig här på forumet, börjar få kläm på xml och xml-import till FM, men går bet på en detalj på sluttampen.

Min fråga gäller (XPath) detaljer i programmering av XSLT-filen, under ROW-taggen, för att kunna importera ett xml dokument, med externt fastställda förutsättningar, i rätt ordning, till ett enda fält och då även särskilja child- taggarna med ett kommatecken (= importera alla <player>-taggar från bifogat xml-dokument till ett race-register /= tabell ) .

(Jag är medveten om att det går att lösa på andra sätt genom att importera tagg-delarna till FM och sen lösa det genom en beräkning. En sådan lösning blir dock svårare att integrera med ett redan befintligt system och kommer också kräva längre tid, nya tabeller, och mer hantering.)

Jag har lyckats att få in all information på en gång i ett fält, men då saknas kommatecken mellan varje tagg-del ( = xml-tagg) , samt att de kommer i fel ordning - alternativet som framgår av avstängda alternativet i koden för XSLT-dokumentet - är att jag får in en player-tagg i rätt ordning med ett kommatecken i mellan varje child-tagg-värde men då kommer bara första <player>-taggs-posten in - som en i och för sig i övrigt korrekt rad.

Så här ser XSLT-filen ut för närvarande

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
 xmlns="http://www.filemaker.com/fmpxmlresult">
    
  <xsl:template match="/">
        <FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
            <ERRORCODE>0</ERRORCODE>
            <PRODUCT BUILD="" NAME="" VERSION=""/>
            <DATABASE DATEFORMAT="M/d/yyyy" LAYOUT="" NAME="" RECORDS="{count(//race)}" TIMEFORMAT="h:mm:ss a"/>
            <METADATA>
                <FIELD>
                    <xsl:attribute name="NAME">results</xsl:attribute><xsl:attribute name="EMPTYOK">YES</xsl:attribute><xsl:attribute name="MAXREPEAT">40</xsl:attribute><xsl:attribute name="TYPE">TEXT</xsl:attribute>
                </FIELD>
            </METADATA>
            <RESULTSET>
                <xsl:attribute name="FOUND"><xsl:value-of select="count(/race/results)"/></xsl:attribute>
                <xsl:for-each select="//race/results">
                <ROW>
                
                    <xsl:attribute name="MODID">0</xsl:attribute>
                    <xsl:attribute name="RECORDID">0</xsl:attribute>
                    
                    <xsl:for-each select="//race/results">

                    <COL>
                        <DATA>
                            <xsl:value-of select="."/>
                        </DATA>
                    </COL>


                    </xsl:for-each>
                </ROW>
            </xsl:for-each>
        </RESULTSET>
         </FMPXMLRESULT>
    </xsl:template>
    
 </xsl:stylesheet>

    

OBS - har skrivit lite noteringar inne i koden för att underlätta något

Här är xml-filens kod:

<?xml version="1.0" encoding="utf-8" ?>
<race>
    <startdate>2010/11/06 22:15:14</startdate>
    <enddate>2010/11/06 22:36:50</enddate>
    <map>
        <name>Cervo RC</name>
        <uid>rbnsR9wy7fiqlIE06kK9FJ7Xe82</uid>
        <author>marsman</author>
        <envir>PortoCervo</envir>
        <length>3.25</length>
    </map>
    <settings>
        <boat>RC44</boat>
        <rules>
            <racemode>Fleet Race</racemode>
            <rulesmode>Auto</rulesmode>
            <startdelay>3 min</startdelay>
        </rules>
        <gamemode>Tactical</gamemode>
        <startdaytime>12:00:00</startdaytime>
        <tide>Low</tide>
        <meteo>Sunny</meteo>
        <wind>
            <dir>Northeast</dir>
            <strength>Force 7</strength>
            <shift>Shifty</shift>
        </wind>
    </settings>
    <results>
        <player><rank>1</rank><login>wasserhess</login><nickname>$i$000***$f00SEA$ef0***$000$i</nickname><time>989326</time></player>
        <player><rank>2</rank><login>michekcano</login><nickname>$00Fmich$fffek$f00cano$fff -              </nickname><time>1002176</time></player>
        <player><rank>3</rank><login>pkulm</login><nickname>$06FPK$000U$F33l$FC0m $i$F63VSK$636Fun</nickname><time>1018301</time></player>
        <player><rank>4</rank><login>andreslzt</login><nickname>peyolageria lzt</nickname><time>1024956</time></player>
        <player><rank>5</rank><login>morgane</login><nickname>$0F9morgan</nickname><time>1043370</time></player>
        <player><rank>6</rank><login>zoreille22</login><nickname>zoreille22</nickname><time>1044489</time></player>
        <player><rank>7</rank><login>nicolacoca</login><nickname>nicolacoca</nickname><time>1053608</time></player>
        <player><rank>8</rank><login>caletero_-_lzt</login><nickname>caletero_-_lzt</nickname><time>1059813</time></player>
        <player><rank>9</rank><login>elsinore__jpn_</login><nickname>$s$fffelsinore $fffJ$f00P$fffN $f00ayc720</nickname><time>1066008</time></player>
        <player><rank>10</rank><login>josemanuel</login><nickname>$w$00fC$f00h$ff0u$f00f$ff0a $fff- $n$0ffcybersea.es</nickname><time>1066100</time></player>
        <player><rank>11</rank><login>po_immoi</login><nickname>$s$i$3CFP$FFFo$3CFI $z$s$i$fc3ITF</nickname><time>1069963</time></player>
        <player><rank>12</rank><login>bullet99</login><nickname>$s$i$001Black Horse $fc0/$063i$001I$fc0AUS </nickname><time>1073693</time></player>
        <player><rank>13</rank><login>hno3</login><nickname>$00fH$fffNO$f003</nickname><time>1077735</time></player>
        <player><rank>14</rank><login>marsman</login><nickname>$i$f33No$ff0 vi$0c0ce</nickname><time>1092122</time></player>
        <player><rank>15</rank><login>colpw</login><nickname>$i$s$dooBreaker$003 ($fc3A$fc3u$fc3s$003)</nickname><time>1115022</time></player>
        <player><rank>16</rank><login>simurgh</login><nickname>simurgh</nickname><time>DNF</time></player>
        <player><rank>17</rank><login>jermu90</login><nickname>jermu90</nickname><time>DNF</time></player>
        <player><rank>18</rank><login>optimist2498</login><nickname>$s$i$090Fre$ff0de$f00rico $00FE. $FFOS. $FFFfulmini</nickname><time>DNC</time></player>
        <player><rank>19</rank><login>giacomo64</login><nickname>$s$f00Spirito Libero$0F0OV$FFFER$F0040</nickname><time>-1</time></player>
        <player><rank>20</rank><login>arc</login><nickname> $0f0a$f00r$FFFc </nickname><time>-1</time></player>
        <player><rank>21</rank><login>_00fmo_fffni_f00ca</login><nickname>$00fJ$fff-$f00L</nickname><time>-1</time></player>
        <player><rank>22</rank><login>jaacek</login><nickname>$FFF$ maaniek$F00$  pol</nickname><time>-1</time></player>
    </results>
</race>

Hur går jag tillväga för att vid importen få ett fält med alla <player>-taggars child-taggar med följande child-taggordning och med ett särskiljande komma-tecken i mellan (såsom en .cvs-fil tidigare såg ut altså):
rank, time, login, nickname / på 22 rader
- det är min fråga - någon som kan?

Innan jag tittar närmare så måste jag få ett förtydligande på vad du önskar uppnå: Vill du ha

a) ett post, med ett fält innehållande 22 rader ( i samma fält)
b) 22 poster med en rad i varje
c) något annat?

  • Medlem
  • Stockholm
  • 2011-01-22 19:00

Svaret är
a) en post, med ett fält innehållande 22 rader ( i samma fält)

Så, om jag förstår dig korrekt så är det inaktiverade exemplet helt korrekt, sånär som på att det saknar en radbrytning mellan varje player?

Du säger också att det är i fel ordning. Vad är rätt ordning då?

  • Medlem
  • Stockholm
  • 2011-01-22 19:48

Det inaktiverade exemplet är korrekt uppställt, men jag får bara ut första raden, (första posten) de andra 21 raderna saknas.

I aktiva exemplet får jag ut alla 22 <player> - taggarna men utan avskiljande kommatecken samt child-taggarna i fel ordning ( altså i den ordning som motsvara xml-dokumentet - där taggarna ligger <rank><login><nickname><time>)

Önskad ordning är <rank>,<time>,<login>,<nickname> med kommatecken som avskiljare

Jag skulle gissa att det är ungefär detta du vill ha. Testa och säg hur det går.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
 xmlns="http://www.filemaker.com/fmpxmlresult">
    
<xsl:template match="/">
	<FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
		<ERRORCODE>0</ERRORCODE>
		<PRODUCT BUILD="" NAME="" VERSION=""/>
		<DATABASE DATEFORMAT="M/d/yyyy" LAYOUT="" NAME="" RECORDS="{count(//race)}" TIMEFORMAT="h:mm:ss a"/>
		<METADATA>
			<FIELD>
				<xsl:attribute name="NAME">results</xsl:attribute><xsl:attribute name="EMPTYOK">YES</xsl:attribute><xsl:attribute name="MAXREPEAT">40</xsl:attribute><xsl:attribute name="TYPE">TEXT</xsl:attribute>
			</FIELD>
		</METADATA>
		<RESULTSET>
			<xsl:attribute name="FOUND"><xsl:value-of select="count(/race/results)"/></xsl:attribute>
			<xsl:for-each select="/race/results">
			<ROW>
				<xsl:attribute name="MODID">0</xsl:attribute>
				<xsl:attribute name="RECORDID">0</xsl:attribute>
				<COL>
					<DATA>
						<xsl:for-each select="player">
							 <xsl:value-of select="rank" />,<xsl:value-of select="time" />,<xsl:value-of select="login" />,<xsl:value-of select="nickname" /><xsl:text>
</xsl:text>
						</xsl:for-each>
					</DATA>
				</COL>
			</ROW>
		</xsl:for-each>
		</RESULTSET>
	</FMPXMLRESULT>
</xsl:template>
    
 </xsl:stylesheet>

Jag gjorde en liten förenkling för att få den mer pedagogisk och mer enligt "best practice" för XPath-uttrycken

  • Medlem
  • Stockholm
  • 2011-01-22 21:52

WOW - SUPERTACK - EXAKT SÅ SOM JAG VILLE HA DET

Jätte bra - vad enkel det ser ut när man får det framför näsan, men det ligger nog en rejäl och gediger erfarenhet bakom )

jättemycket + Ännu mera TACK!

Som all programmering är XSL logiskt uppbyggt, och i och med XML är läsbart för människor så går det ju att följa logiken väl.

Svårigheten är ju lite som att lära sig ett nytt främmande (talat) språk, dvs. man kan lära sig härma en given mening, eller förstå en skriven text med hjälp av lexikon, men att gå därifrån till att kunna uttrycka det man vill bygger såklart på inlärning och (ut)övning.

Det som är så vansinnigt bra med det är att man kan vrida runt och stuva om i data på närmast obegränsade sätt.

  • Medlem
  • Stockholm
  • 2011-01-23 11:34
Citat:

Det som är så vansinnigt bra med det är att man kan vrida runt och stuva om i data på närmast obegränsade sätt.

Ja, och det är först när man ser och förstår detta, som man förstår värdet av xml.
Problemet för nybörjaren är ju att det integrerar med XPath och samtidigt är ett eget språk (logik).

När man väl bryter barriären och börjar förstå helheten, logiken och uppställningarna i XSLT, så förstår man samtidigt hur rätt du har.

Får nog utöka bokhyllan med en bra XML/XSLT-bibel, har du något förslag?

1
Bevaka tråden