[GastForen Programme Print/Bildbearbeitung Adobe InDesign XML mittels XSLT importieren

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

XML mittels XSLT importieren

bernd.richter
Beiträge gesamt: 44

9. Mär 2010, 15:30
Beitrag # 1 von 22
Bewertung:
(12045 mal gelesen)
URL zum Beitrag
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
X

XML mittels XSLT importieren

bernd.richter
Beiträge gesamt: 44

9. Mär 2010, 17:07
Beitrag # 2 von 22
Beitrag ID: #435832
Bewertung:
(12016 mal gelesen)
URL zum Beitrag
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?


als Antwort auf: [#435801]

XML mittels XSLT importieren

Neil77
Beiträge gesamt: 287

9. Mär 2010, 18:58
Beitrag # 3 von 22
Beitrag ID: #435850
Bewertung:
(11993 mal gelesen)
URL zum Beitrag
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


als Antwort auf: [#435832]

XML mittels XSLT importieren

bernd.richter
Beiträge gesamt: 44

10. Mär 2010, 09:24
Beitrag # 4 von 22
Beitrag ID: #435903
Bewertung:
(11960 mal gelesen)
URL zum Beitrag
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


als Antwort auf: [#435850]

XML mittels XSLT importieren

Neil77
Beiträge gesamt: 287

10. Mär 2010, 12:23
Beitrag # 5 von 22
Beitrag ID: #435928
Bewertung:
(11936 mal gelesen)
URL zum Beitrag
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


als Antwort auf: [#435903]

XML mittels XSLT importieren

bernd.richter
Beiträge gesamt: 44

10. Mär 2010, 12:49
Beitrag # 6 von 22
Beitrag ID: #435934
Bewertung:
(11927 mal gelesen)
URL zum Beitrag
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>



als Antwort auf: [#435928]

XML mittels XSLT importieren

Neil77
Beiträge gesamt: 287

10. Mär 2010, 15:16
Beitrag # 7 von 22
Beitrag ID: #435955
Bewertung:
(11901 mal gelesen)
URL zum Beitrag
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


als Antwort auf: [#435934]

XML mittels XSLT importieren

Neil77
Beiträge gesamt: 287

10. Mär 2010, 15:25
Beitrag # 8 von 22
Beitrag ID: #435957
Bewertung:
(11894 mal gelesen)
URL zum Beitrag
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>



als Antwort auf: [#435955]

XML mittels XSLT importieren

bernd.richter
Beiträge gesamt: 44

10. Mär 2010, 15:58
Beitrag # 9 von 22
Beitrag ID: #435964
Bewertung:
(11879 mal gelesen)
URL zum Beitrag
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...


als Antwort auf: [#435957]

XML mittels XSLT importieren

Neil77
Beiträge gesamt: 287

10. Mär 2010, 16:30
Beitrag # 10 von 22
Beitrag ID: #435965
Bewertung:
(11865 mal gelesen)
URL zum Beitrag
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


als Antwort auf: [#435964]

XML mittels XSLT importieren

bernd.richter
Beiträge gesamt: 44

10. Mär 2010, 16:45
Beitrag # 11 von 22
Beitrag ID: #435969
Bewertung:
(11860 mal gelesen)
URL zum Beitrag
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!


als Antwort auf: [#435965]

XML mittels XSLT importieren

Neil77
Beiträge gesamt: 287

10. Mär 2010, 17:05
Beitrag # 12 von 22
Beitrag ID: #435974
Bewertung:
(11845 mal gelesen)
URL zum Beitrag
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


als Antwort auf: [#435969]

XML mittels XSLT importieren

bernd.richter
Beiträge gesamt: 44

10. Mär 2010, 17:13
Beitrag # 13 von 22
Beitrag ID: #435975
Bewertung:
(11837 mal gelesen)
URL zum Beitrag
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.


als Antwort auf: [#435974]

XML mittels XSLT importieren

Neil77
Beiträge gesamt: 287

10. Mär 2010, 17:24
Beitrag # 14 von 22
Beitrag ID: #435977
Bewertung:
(11830 mal gelesen)
URL zum Beitrag
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.


als Antwort auf: [#435975]

XML mittels XSLT importieren

bernd.richter
Beiträge gesamt: 44

10. Mär 2010, 17:52
Beitrag # 15 von 22
Beitrag ID: #435982
Bewertung:
(11811 mal gelesen)
URL zum Beitrag
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


als Antwort auf: [#435977]
X