Forenindex » Programme » Print/Bildbearbeitung » Adobe InDesign » XML mittels XSLT importieren

XML mittels XSLT importieren

bernd.richter
Beiträge gesamt: 44

9. Mär 2010, 15:30
Bewertung:

gelesen: 12059

Beitrag als Lesezeichen
Hallo Zusammen!

Nachdem ich am Scripten gescheitert bin, versuche ich meinen Arbeitsablauf nun mittels dem InDesign XML-Import zu automatisieren.

Aus einer Excel Datei lasse ich mir eine XML erzeugen. Leider ist diese dann im komplizierten Office-XML Format. Mittels einer XSLT Datei will ich nun beim XML-Import nur die relevanten Daten aus der XML ziehen und diesen Tags zuweisen, sodass diese in Indesign automatisch in die Rahmen eingefügt werden.
Leider komme ich mit dem Office-XML Format nicht zurecht.
Code
<Row> 
<Cell ss:StyleID="s23">
<Data ss:Type="String"/>
<NamedCell ss:Name="DATA1"/>
<NamedCell ss:Name="TESTKEYS"/>
<NamedCell ss:Name="TEST0"/>
</Cell>
<Cell ss:StyleID="s23">
<Data ss:Type="String">4</Data>
<NamedCell ss:Name="DATA2"/>
<NamedCell ss:Name="TESTKEYS"/>
<NamedCell ss:Name="TEST0"/>
</Cell>
<Cell ss:StyleID="s23">
<Data ss:Type="String">1</Data>
<NamedCell ss:Name="TESTKEYS"/>
<NamedCell ss:Name="DATA3"/>
<NamedCell ss:Name="TEST0"/>
</Cell>
<Cell ss:StyleID="s21">
<Data ss:Type="String">A63027A01BL</Data>
<NamedCell ss:Name="DATA4"/>
<NamedCell ss:Name="TEST0"/>
</Cell>
</Row>


Wie kann ich mittels XLS aus obigen Beispiel den Wert "A63027A01BL" auslesen/bearbeiten.
Als Ausgabe sollte dieser Ausdruck in ein
<Bild href="file://A63027A01BL.EPS"></Bild> verwandelt werden, um so als Grafik nach InDesign importiert zu werden.
Der Ausdruck "A63027A01BL" ändert sich bei jeder neuen Excel Datei, weshalb mein Problem ist, dass ich ihn nicht eindeutig ansprechen kann.
Weiß jemand Rat, bin über jeden Ansatz dankbar!

Viele Grüße

Bernd

XML mittels XSLT importieren

bernd.richter
Beiträge gesamt: 44

9. Mär 2010, 17:07
Bewertung:

gelesen: 12030

Beitrag als Lesezeichen
Nach einigem rumprobieren, habe ich http://support.microsoft.com/kb/278976/de hier etwas Hilfe gefunden.

Jedoch sagt mein XML Editor Undeclared namespase prefix {ss}

So hab ichs probiert:
Code
<CustomerID><xsl:value-of select='Workbook/Worksheet/Table/Row/Cell[NamedCell[@ss:Name="DATA4"]]'/></CustomerID> 

<xsl:for-each select='Workbook/Worksheet/Table/Row[Cell[NamedCell[@ss:Name="DATA4"]]]'>

<xsl:template match='Cell[NamedCell[@ss:Name="DATA4"]]'>
<Bild><xsl:value-of select='Data'/></Bild>
</xsl:template>


Der konstante Teil in der XML ist nämlich die Bezeichnung "DATA4". Nur wie sag ich per XSLT dass ich die Zelle mit diesem Wert haben möchte?

XML mittels XSLT importieren

Neil77
Beiträge gesamt: 287

9. Mär 2010, 18:58
Bewertung:

gelesen: 12007

Beitrag als Lesezeichen
Hallo Bernd,

versuch mal, den Verweis auf den Namespace-Prefix (der in deiner Quelldatei vorhanden sein sollte) in das Root-Element deines Stylesheets einzubauen.
ungefähr so:
Code
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" version="1.0"> 
...


Grüße, Martin
--
Martin Heise
http://www.martinheise.de

XML mittels XSLT importieren

bernd.richter
Beiträge gesamt: 44

10. Mär 2010, 09:24
Bewertung:

gelesen: 11974

Beitrag als Lesezeichen
Danke für deine Antwort!

War mittlerweile schon daraufgekommen noch den Office XML Namespace einzubinden. Jetzt gibts keinen Fehler mehr.

Nur leider kann ich den Wert immer noch nicht auslesen. Weißt du vielleicht wie ich das Regeln könnte?

Beste Grüße

Bernd

XML mittels XSLT importieren

Neil77
Beiträge gesamt: 287

10. Mär 2010, 12:23
Bewertung:

gelesen: 11950

Beitrag als Lesezeichen
Hallo, Bernd,

prinzipiell müsste das schon so funktionieren, wie du's oben schreibst. Kannst du mal dein ganzes Stylesheet und die Quelldatei (bzw. überschaubare Beispieldatei) posten?

Grüße, Martin
--
Martin Heise
http://www.martinheise.de

XML mittels XSLT importieren

bernd.richter
Beiträge gesamt: 44

10. Mär 2010, 12:49
Bewertung:

gelesen: 11941

Beitrag als Lesezeichen
Danke für diene Hilfe!

Hier habe ich mal meine letzten Ansatz, der mir sämtliche Werte ausgibt:

Code
<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xdt="http://www.w3.org/2005/xpath-datatypes" xmlns:err="http://www.w3.org/2005/xqt-errors" xmlns:zuf="http://www.beispiel.com/zuf/3.0" xmlns:pri="http://www.pmn.net/prn/PntI" xmlns:ws="urn:schemas-microsoft-com:office:spreadsheet" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="Workbook/Worksheet/Table/Row/Cell[NamedCell[@ss:Name='DATA4']]">
<Bild>
<xsl:apply-templates select="Data">
</xsl:apply-templates>
</Bild>
</xsl:template>

<xsl:template match="Workbook/Worksheet/Table/Row/Cell/NamedCell[@ss:Name='DATA4']">
<Bild>
<xsl:value-of select="Workbook/Worksheet/Table/Row/Cell[NamedCell[@ss:Name='DATA4']]/text()">
</xsl:value-of>
</Bild>
</xsl:template>
</xsl:stylesheet>


Da ich keine Datei Anhängen kann, hier mal die schon stark gekürzte xml Datei:

Code
<?xml version="1.0"?> 
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
<Author>Bernd Richter</Author>
<LastAuthor>Bernd Richter</LastAuthor>
<Version>11.1282</Version>
</DocumentProperties>
<OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
<AllowPNG/>
<Colors>
<Color>
<Index>16</Index>
<RGB>#9999FF</RGB>
</Color>
<Color>
<Index>17</Index>
<RGB>#993366</RGB>
</Color>
<Color>
<Index>18</Index>
<RGB>#FFFFCC</RGB>
</Color>
<Color>
<Index>19</Index>
<RGB>#CCFFFF</RGB>
</Color>
<Color>
<Index>20</Index>
<RGB>#660066</RGB>
</Color>
<Color>
<Index>21</Index>
<RGB>#FF8080</RGB>
</Color>
<Color>
<Index>22</Index>
<RGB>#0066CC</RGB>
</Color>
<Color>
<Index>23</Index>
<RGB>#CCCCFF</RGB>
</Color>
<Color>
<Index>24</Index>
<RGB>#000080</RGB>
</Color>
<Color>
<Index>25</Index>
<RGB>#FF00FF</RGB>
</Color>
<Color>
<Index>26</Index>
<RGB>#FFFF00</RGB>
</Color>
<Color>
<Index>27</Index>
<RGB>#00FFFF</RGB>
</Color>
<Color>
<Index>28</Index>
<RGB>#800080</RGB>
</Color>
<Color>
<Index>29</Index>
<RGB>#800000</RGB>
</Color>
<Color>
<Index>30</Index>
<RGB>#008080</RGB>
</Color>
<Color>
<Index>31</Index>
<RGB>#0000FF</RGB>
</Color>
</Colors>
</OfficeDocumentSettings>
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
<WindowHeight>10740</WindowHeight>
<WindowWidth>12800</WindowWidth>
<WindowTopX>2900</WindowTopX>
<WindowTopY>-360</WindowTopY>
<TabRatio>600</TabRatio>
<ProtectStructure>False</ProtectStructure>
<ProtectWindows>False</ProtectWindows>
</ExcelWorkbook>
<Styles>
<Style ss:ID="Default" ss:Name="Normal">
<Alignment ss:Vertical="Bottom"/>
<Borders/>
<Font/>
<Interior/>
<NumberFormat/>
<Protection/>
</Style>
<Style ss:ID="s21">
<NumberFormat ss:Format="@"/>
</Style>
<Style ss:ID="s22">
<Interior ss:Color="#90713A" ss:Pattern="Solid"/>
</Style>
<Style ss:ID="s23">
<Interior ss:Color="#FFFF99" ss:Pattern="Solid"/>
<NumberFormat ss:Format="@"/>
</Style>
<Style ss:ID="s24">
<Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
<Interior ss:Color="#FFFF99" ss:Pattern="Solid"/>
</Style>
</Styles>
<Names>
<NamedRange ss:Name="DATA1" ss:RefersTo="=Tabelle1!R2C1"/>
<NamedRange ss:Name="DATA2" ss:RefersTo="=Tabelle1!R2C2"/>
<NamedRange ss:Name="DATA3" ss:RefersTo="=Tabelle1!R2C3"/>
<NamedRange ss:Name="DATA4" ss:RefersTo="=Tabelle1!R2C4"/>
</Names>
<Worksheet ss:Name="Tabelle1">
<Table ss:ExpandedColumnCount="4" ss:ExpandedRowCount="2" x:FullColumns="1"
x:FullRows="1" ss:DefaultColumnWidth="65.0" ss:DefaultRowHeight="12.0">
<Column ss:Width="23.0"/>
<Column ss:Width="21.0"/>
<Column ss:Width="24.0"/>
<Column ss:Width="77.0"/>
<Row>
<Cell ss:StyleID="s22"><Data ss:Type="String">MK</Data><NamedCell
ss:Name="TESTVKEY"/></Cell>
<Cell ss:StyleID="s22"><Data ss:Type="String">SA</Data><NamedCell
ss:Name="TESTVKEY"/></Cell>
<Cell ss:StyleID="s22"><Data ss:Type="String">IND</Data><NamedCell
ss:Name="TESTVKEY"/></Cell>
<Cell ss:StyleID="s24"><Data ss:Type="String">Material</Data><NamedCell
ss:Name="TESTHKEY"/></Cell>
</Row>
<Row>
<Cell ss:StyleID="s23"><Data ss:Type="String"></Data><NamedCell ss:Name="DATA1"/><NamedCell
ss:Name="TESTKEYS"/><NamedCell ss:Name="TEST0"/></Cell>
<Cell ss:StyleID="s23"><Data ss:Type="String">4</Data><NamedCell
ss:Name="DATA2"/><NamedCell ss:Name="TESTKEYS"/><NamedCell ss:Name="TEST0"/></Cell>
<Cell ss:StyleID="s23"><Data ss:Type="String">1</Data><NamedCell
ss:Name="TESTKEYS"/><NamedCell ss:Name="DATA3"/><NamedCell ss:Name="TEST0"/></Cell>
<Cell ss:StyleID="s21"><Data ss:Type="String">A63027A01BL</Data><NamedCell
ss:Name="DATA4"/><NamedCell ss:Name="TEST0"/></Cell>
</Row>
</Table>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<PageSetup>
<Header x:Margin="0.4921259845"/>
<Footer x:Margin="0.4921259845"/>
</PageSetup>
<PageLayoutZoom>0</PageLayoutZoom>
<Selected/>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
</Workbook>

XML mittels XSLT importieren

Neil77
Beiträge gesamt: 287

10. Mär 2010, 15:16
Bewertung:

gelesen: 11915

Beitrag als Lesezeichen
Hallo, Bernd,

eine harte Nuss, aber so langsam beginne ich's zu kapieren ... Der Knackpunkt ist, jeden Namespace immer voll mitzuziehen, auch den Default-namespace (...spreadsheet) muss man explizit aufführen.

So funktioniert's bei mir:
Code
<?xml version="1.0" encoding="UTF-8"?>  
<xsl:stylesheet version="2.0" xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*" />

<xsl:template match="/" >
<xsl:element name="output">
<xsl:apply-templates />
</xsl:element>
</xsl:template>

<xsl:template match="ss:*">
<xsl:apply-templates />
</xsl:template>

<xsl:template match="ss:Cell">
</xsl:template>

<xsl:template match="ss:Worksheet/ss:Table/ss:Row/ss:Cell[ss:NamedCell[@ss:Name='DATA4']]">
<xsl:element name="Bild">
<xsl:value-of select="./ss:Data" />
</xsl:element>
</xsl:template>

<xsl:template match="*">
</xsl:template>


</xsl:stylesheet>


Ist das so, wie du es wolltest?

Grüße, Martin
--
Martin Heise
http://www.martinheise.de

XML mittels XSLT importieren

Neil77
Beiträge gesamt: 287

10. Mär 2010, 15:25
Bewertung:

gelesen: 11908

Beitrag als Lesezeichen
äh, Doppelpost, naja ...

so noch etwas kürzer:
Code
<?xml version="1.0" encoding="UTF-8"?>   
<xsl:stylesheet version="2.0" xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*" />

<xsl:template match="/" >
<xsl:element name="output">
<xsl:apply-templates select="//ss:Worksheet/ss:Table/ss:Row/ss:Cell[ss:NamedCell[@ss:Name='DATA4']]" />
</xsl:element>
</xsl:template>


<xsl:template match="ss:Worksheet/ss:Table/ss:Row/ss:Cell[ss:NamedCell[@ss:Name='DATA4']]">
<xsl:element name="Bild">
<xsl:value-of select="./ss:Data" />
</xsl:element>
</xsl:template>


</xsl:stylesheet>

--
Martin Heise
http://www.martinheise.de

XML mittels XSLT importieren

bernd.richter
Beiträge gesamt: 44

10. Mär 2010, 15:58
Bewertung:

gelesen: 11893

Beitrag als Lesezeichen
Hey super! Vielen, vielen Dank für diene Mühe!
Jetzt funktionierts.

Zwischenzeitlich habe ich auch eine andere Lösung gefunden:

Code
Altova unterstützt XSLT 2.0, dann kannst du xpath-default-namespace benutzen: 


Code
<xsl:stylesheet 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xpath-default-namespace="urn:schemas-microsoft-com:office:spreadsheet"
exclude-result-prefixes="ss"
version="2.0">

<xsl:output method="xml" indent="yes"/>

<xsl:template match="/">
<Root>
<xsl:apply-templates select="descendant::Cell[NamedCell/@ss:Name = 'DATA4']"/>
</Root>
</xsl:template>

<xsl:template match="Cell">
<Bild href="file:///(1234){Data}_k.eps"/>
</xsl:template>

</xsl:stylesheet>


dann wird aus

Code
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
<Row>
<Cell ss:StyleID="s23">
<Data ss:Type="String"/>
<NamedCell ss:Name="DATA1"/>
<NamedCell ss:Name="TESTKEYS"/>
<NamedCell ss:Name="TEST0"/>
</Cell>
<Cell ss:StyleID="s23">
<Data ss:Type="String">4</Data>
<NamedCell ss:Name="DATA2"/>
<NamedCell ss:Name="TESTKEYS"/>
<NamedCell ss:Name="TEST0"/>
</Cell>
<Cell ss:StyleID="s23">
<Data ss:Type="String">1</Data>
<NamedCell ss:Name="TESTKEYS"/>
<NamedCell ss:Name="DATA3"/>
<NamedCell ss:Name="TEST0"/>
</Cell>
<Cell ss:StyleID="s21">
<Data ss:Type="String">A63027A01BL</Data>
<NamedCell ss:Name="DATA4"/>
<NamedCell ss:Name="TEST0"/>
</Cell>
</Row>
</Workbook>


das folgende Resultat erzeugt:

Code
<Root> 
<Bild href="file:///(1234)A63027A01BL_k.eps"/>
</Root>




Das bringt mich näher zu meinem Ergebnis, da ich den Ausdruck zu einem Bild-Pfad wandeln will.

Leider funktioniert der Import nach InDesign trotzdem nicht! Auch mit deiner .xslt nicht...

XML mittels XSLT importieren

Neil77
Beiträge gesamt: 287

10. Mär 2010, 16:30
Bewertung:

gelesen: 11879

Beitrag als Lesezeichen
xpath-default-namespace ist ja ne schöne Sache, das vereinfacht das deutlich!

InDesign kann allerdings kein XSLT 2.0, das kann also leider nicht direkt gehen.
Mit meinem obigen Stylesheet krieg ich den Import allerdings schon hin. Hast du bei den Import-Optionen noch was falsch?

Grüße, Martin
--
Martin Heise
http://www.martinheise.de

XML mittels XSLT importieren

bernd.richter
Beiträge gesamt: 44

10. Mär 2010, 16:45
Bewertung:

gelesen: 11874

Beitrag als Lesezeichen
Haha, das erklärt natürlich einiges!
Schade, dass InDesign den Namespace nicht unterstützt, da ich noch weitere Felder aus dieser XML auslesen muss und diese Lösung doch länger ist ;)

Der Import klappt leider nicht, wie würdest du vorgehen um den zusammengestezten Bildpfad zu generieren?

Die Import-Funktionen sollten stimmen, das Bild wird bei meiner dummy xml korrekt importiert.

Aber so funktionierts wenigstens, danke!

XML mittels XSLT importieren

Neil77
Beiträge gesamt: 287

10. Mär 2010, 17:05
Bewertung:

gelesen: 11859

Beitrag als Lesezeichen
Ah, der Import klappt, nur der Bezug auf's Bild nicht?

unter Windows zumindest muss der Pfad in etwa so aussehen:
Code
file:///C:/Ordner/Bild.gif 

Liegt das Bild im Ordner der xml-Datei, dann sollte das klappen:
Code
href=file:Bild.gif 


Grüße, Martin
--
Martin Heise
http://www.martinheise.de

XML mittels XSLT importieren

bernd.richter
Beiträge gesamt: 44

10. Mär 2010, 17:13
Bewertung:

gelesen: 11851

Beitrag als Lesezeichen
Wenn ich dein Script so importiere und dem Bild-Tag einen Textrahmen zuweise, wird der Wert ohne Probleme als Text eingefügt.

Aber wie kann ich den Pfad in das Bild-Tag schreiben?
Als Ausgabe hätte ich gerne:

Code
<Root> 
<Bild href="file:///(1234)A63027A01BL_k.eps"/>
</Root>


A63027A01BL ist der Wert aus dem Feld DATA4.

Sorry, dass ich so umständlich bin, habe leider noch nicht viel Erfahrung mit XML/XSL.

XML mittels XSLT importieren

Neil77
Beiträge gesamt: 287

10. Mär 2010, 17:24
Bewertung:

gelesen: 11844

Beitrag als Lesezeichen
Ah, sorry, ich hab eben geistig mein Stylesheet, in dem ich den Wert einfach nur so ausgelesen hatte, mit deinem an der Stelle konkreteren gemischt (du warst nämlich schon fast so weit ;-) ...).
Du musst die Stelle mit dem Element Bild" mit diesem ausführlicheren Code ersetzen:
Code
... 
<xsl:element name="Bild">
<xsl:attribute name="href">file:///(1234)<xsl:value-of select="./ss:Data" />_k.eps</xsl:attribute>
</xsl:element>
...


Das fügt ein Bild-Element ein und weist diesem das entsprechende href-Attribut zu.
--
Martin Heise
http://www.martinheise.de

XML mittels XSLT importieren

bernd.richter
Beiträge gesamt: 44

10. Mär 2010, 17:52
Bewertung:

gelesen: 11825

Beitrag als Lesezeichen
Vielen Dank Martin!

Klappt alles wunderbar! Jetzt gehts noch darum die Details zu machen und weitere Daten reinzuziehen. Aber das Problem hat mir schon einen Einblick in die Materie gegeben, der mir weiterhilft.
Falls ich weitere Fragen habe, kann ich sie hoffentlich weiterhin hier posten, eventuell hilfts ja auch anderen Usern.

Grüße Bernd

XML mittels XSLT importieren

bernd.richter
Beiträge gesamt: 44

11. Mär 2010, 13:07
Bewertung:

gelesen: 2052

Beitrag als Lesezeichen
Leider habe ich nun schon die nächsten Probleme (immerhin habe ich es schon geschafft eine if-Abfrage zu konstruieren):

Der obige Pfad setzt sich wie folgt zusammen:
//file:/60(93)A63027A01BL_k.eps
Der Wert 60 muss wiederum aus der XML gelesen werden. Der Pfad setzt sich also aus zwei unterschiedlichen Werten zusammen.
Den Wert kann ich auslesen, aber leider nicht im Pfad verschachteln. Außerdem soll aus 60,000 noch 60 werden.

Das andere Problem ist ich kann einen Abgefragten Wert nicht nochmal auslesen und in ein anderes Tag schreiben. Im Beispiel soll der Bild-Pfad generiert werden, aber auch der Wert in ein anderes Tag geschrieben werden.

XML mittels XSLT importieren

bernd.richter
Beiträge gesamt: 44

11. Mär 2010, 16:20
Bewertung:

gelesen: 2029

Beitrag als Lesezeichen
Habe die Lösung für das Umwandeln von 60,000 in 60 schon gefunden!
Dies funktioniert mittels substring.

Code:

...
<xsl:value-of select="substring(./ss:Data, 1, 2)" />
...

Dieser Code extrahiert ab dem 1. Zeichen des Wertes bis zum 2. Zeichen.

Wie kann ich diesen Wert jetzt noch an den Bildpfad übergeben?
Ich habe es schon mit xsl:variable und xsl:param probiert, bin aber zu keinem Ergebnis gekommen...

XML mittels XSLT importieren

Neil77
Beiträge gesamt: 287

11. Mär 2010, 17:52
Bewertung:

gelesen: 2011

Beitrag als Lesezeichen
Hallo, Bernd,

das kommt darauf an ... wo steht denn die Zahl, also in Relation zu deinem Cell-Element, in dem du dich wahrscheinlich befindest? Du musst dann eigentlich nur den entsprechenden relativen oder auch absoluten Pfad in deinen select-Ausdruck eingeben.

Grüße, Martin
--
Martin Heise
http://www.martinheise.de

XML mittels XSLT importieren

bernd.richter
Beiträge gesamt: 44

11. Mär 2010, 18:42
Bewertung:

gelesen: 2000

Beitrag als Lesezeichen
Hi Martin,

Das Problem ist, dieser Wert steht in der Zelle DATA3. Das Bild-Tag in welchem ich den Pfad angebe, generiere ich aber aus DATA4. Ich dachte ich übergebe den Wert per Variable, das funktioniert aber irgendwie nicht.

Was denkst du?

Gruß,

Bernd

XML mittels XSLT importieren

Neil77
Beiträge gesamt: 287

11. Mär 2010, 20:42
Bewertung:

gelesen: 1980

Beitrag als Lesezeichen
Hallo, Bernd

du kommst per XPath eigentlich an alle Knoten ran, wenn die Beziehung klar ist. Also: z.B.: Das Element steht dem aktuellen direkt zuvor, oder aber irgendwo in der Datei aber mit einem bestimmten Inhalt, oder ...

Wenn es sich bei Zelle, die du ansprechen willst, immer um ein vorhergehendes Geschwister mit dem "Namen" DATA3 handelt, kann dir z.B. das weiterhelfen:
Code
<xsl:value-of select="preceding-sibling::ss:Cell[ss:NamedCell[@ss:Name='DATA3']]" /> 


Ob das aber der Königsweg ist, hängt davon ab, wie deine Eingangsdaten allgemein strukturiert sind, und was du sonst noch erreichen musst. Wenn du da weiter in die Details vordringen willst, solltest du dir unbedingt mal eine der vielen XSLT-Referenzen oder -tutorials, die es im Netz gibt, näher anschauen. Z.B.
http://www.zvon.org/...ce/Output/index.html
http://www.w3schools.com/...sl_w3celementref.asp
Wenn du darüber einen Überblick hast, weißt du schonmal, was überhaupt machbar ist, und bekommst ein Gefühl dafür, in welcher Richtung du suchen musst. Das ist alles erstmal recht komplex, aber lohnt sich!

Grüße, Martin
--
Martin Heise
http://www.martinheise.de

XML mittels XSLT importieren

bernd.richter
Beiträge gesamt: 44

12. Mär 2010, 09:36
Bewertung:

gelesen: 1952

Beitrag als Lesezeichen
Guten Morgen Martin,

ich weiß es gibt viele Tutorials und Referenzen, und ich schaue auch oft bei denen nach. Leider habe ich noch keine Lösung für mein spezielles Problem gefunden.

Code
<xsl:template match="ss:Worksheet/ss:Table/ss:Row/ss:Cell[ss:NamedCell[@ss:Name='DATA4']]">  
<xsl:element name="Pfad">
<xsl:attribute name="href">file://--DATA66--(93)<xsl:value-of select="./ss:Data" />_k.eps</xsl:attribute>
</xsl:element>
</xsl:template>


Mein Element <Pfad> generiere ich ja im Template DATA4 und übergebe den Wert mit <xsl:value-of select="./ss:Data" />. Da ich ja in DATA4 bin, kann ich ja nicht nochmal mit <xsl:value-of select="./ss:Data" /> den Text aus DATA3 übergeben.

Hier habe ich es mal mit Variablen probiert:

Code
<xsl:stylesheet version="2.0" xmlns:o="urn:schemas-microsoft-com:office:office"   
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:strip-space elements="*" />

<xsl:template match="/" >
<xsl:element name="Root">
<xsl:apply-templates />
</xsl:element>
</xsl:template>

<xsl:template match="ss:*">
<xsl:apply-templates />
</xsl:template>

<xsl:template match="ss:Cell">
</xsl:template>


<xsl:template match="ss:Worksheet/ss:Table/ss:Row/ss:Cell[ss:NamedCell[@ss:Name='DATA66']]">
<xsl:variable name="pfad"
select="substring(./ss:Data,1,2)"/>
</xsl:template>
<xsl:template match="ss:Worksheet/ss:Table/ss:Row/ss:Cell[ss:NamedCell[@ss:Name='DATA4']]">
<xsl:variable name="wert"
select="substring(./ss:Data,1,2)"/>
</xsl:template>
<Pfad><xsl:value-of select="$pfad"/></Pfad>
<Bild href="file:///{$pfad}(34){$wert}_k.eps"/>
<Wert><xsl:value-of select="$wert"/></Wert>



</xsl:stylesheet>


Dies funktioniert leider nicht da die beiden Variablen aus verschiedenen Knoten ausgelesen werden. Kann ich die Variablen global definieren?
Ich habe übrigens diesmal das Feld DATA66 verwendet, da dies bei einer späteren Anwendung der Fall sein wird.

XML mittels XSLT importieren

bernd.richter
Beiträge gesamt: 44

12. Mär 2010, 14:47
Bewertung:

gelesen: 1929

Beitrag als Lesezeichen
So, habs endlich geschafft! Hier die Lösung:

Code
<xsl:stylesheet 
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
exclude-result-prefixes="ss">

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*" />

<xsl:template match="/">
<Root>
<xsl:variable name="pfad"
select="substring-before(//ss:Cell[ss:NamedCell/@ss:Name = 'DATA3']/ss:Data, ',')"/>
<xsl:variable name="wert"
select="//ss:Cell[ss:NamedCell/@ss:Name = 'DATA4']/ss:Data"/>
<Pfad><xsl:value-of select="$pfad"/></Pfad>
<Bild href="file:///{$pfad}(34){$wert}_k.eps"/>
<Wert><xsl:value-of select="$wert"/></Wert>
</Root>
</xsl:template>

</xsl:stylesheet>