Willkommen bei Entwickler-Forum.
Ergebnis 1 bis 4 von 4
  1. #1
    Aufsteiger
    Registriert seit
    24.09.2010
    Beiträge
    91

    Standard XSL document() debuggen

    Ich habe folgendes XML

    Code:
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
      xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
      <fileVersion appName="xl" lastEdited="5" lowestEdited="5" rupBuild="9303"/>
      <workbookPr/>
      <bookViews>
        <workbookView xWindow="120" yWindow="30" windowWidth="18825" windowHeight="12240"/>
      </bookViews>
      <sheets>
        <sheet name="Sheet1" sheetId="2" r:id="rId1"/>
        <sheet name="Sheet 2" sheetId="3" r:id="rId2"/>
        <sheet name="Worksheet # Three" sheetId="1" r:id="rId3"/>
      </sheets>
      <calcPr calcId="145621"/>
    </workbook>
    In meinem XSL versuche ich die sheetId für ein bestimmtes sheet zu ermitteln:

    Code:
        <xsl:variable name="sheetId">
          <xsl:value-of select="document('input-xlsx/xl/workbook.xml')/workbook/sheets/sheet[@name=$worksheet]/@sheetId"/>
        </xsl:variable>
        <xsl:value-of select="$sheetId"/>
    Die Variable ist jedoch leider leer bzw es wird nichts ausgegeben. Ich habe den Pfad geprüft, an Hand vorheriger Transformationen auch die Syntax verifiziert und leider ist mein Debugger nicht in der Lage die externe Quelle nachzuladen.

    Testweise habe ich versucht zu debuggen, indem ich document('input-xlsx/xl/workbook.xml')/count(*) zugewiesen habe und bekam 1 als Ergebnis (müßte stimmen: Anzahl der Root-Elemente ist 1). Aber schon bei .../local-name(.) und andere Versuche schlagen fehl.

    Ich vermute, daß es wieder zu spät ist, um die offensichtlichen Fehler zu sehen - jemand eine Idee?
    --
    Cheers Vince

  2. #2

    Standard

    Durch
    workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
    befindet sich das Element und seine Nachfahren in dem Namensraum, wie immer mit XPath und XSLT (d.h., egal ob das Dokument als primäre Eingabe benutzt wird oder per "document", "doc" oder "collection" als sekundäre) muss man dann den Pfad anpassen und einen Präfix für den Namensraum deklarieren und in Pfadausdrücken verwenden oder den xpath-default-namespace setzen. Mit XSLT und XPath 2 ist das mittels
    Code:
    <xsl:variable name="sheetId" xpath-default-namespace="http://schemas.openxmlformats.org/spreadsheetml/2006/main" select="document('input-xlsx/xl/workbook.xml')/workbook/sheets/sheet[@name=$worksheet]/@sheetId"/>
    möglich. Wenn man in einem Stylesheet nun mehrere Dokumente mit verschiedenen Namensräumen verwendet, muss man bei Verwendung von xpath-default-namespace nur aufpassen, dass die Deklaration so lokal erfolgt, dass nicht die Bedeutung für Pfadausdrücke an anderer Stelle geändert wird. Oder man wählt und deklariert eben konsequent und konsistent im Stylesheet Präfixe für alle benötigten Namensräume und benutzt diese dann in Pfadausdrücken.

  3. #3
    Aufsteiger
    Registriert seit
    24.09.2010
    Beiträge
    91

    Standard Aha!

    Zitat Zitat von Martin Honnen Beitrag anzeigen
    Durch
    workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
    befindet sich das Element und seine Nachfahren in dem Namensraum, wie immer mit XPath und XSLT (d.h., egal ob das Dokument als primäre Eingabe benutzt wird oder per "document", "doc" oder "collection" als sekundäre) muss man dann den Pfad anpassen und einen Präfix für den Namensraum deklarieren und in Pfadausdrücken verwenden oder den xpath-default-namespace setzen. Mit XSLT und XPath 2 ist das mittels
    Code:
    <xsl:variable name="sheetId" xpath-default-namespace="http://schemas.openxmlformats.org/spreadsheetml/2006/main" select="document('input-xlsx/xl/workbook.xml')/workbook/sheets/sheet[@name=$worksheet]/@sheetId"/>
    möglich. Wenn man in einem Stylesheet nun mehrere Dokumente mit verschiedenen Namensräumen verwendet, muss man bei Verwendung von xpath-default-namespace nur aufpassen, dass die Deklaration so lokal erfolgt, dass nicht die Bedeutung für Pfadausdrücke an anderer Stelle geändert wird. Oder man wählt und deklariert eben konsequent und konsistent im Stylesheet Präfixe für alle benötigten Namensräume und benutzt diese dann in Pfadausdrücken.
    Perfekt! Und wieder dazugelernt - vielen Dank, Martin!
    --
    Cheers Vince

  4. #4
    Aufsteiger
    Registriert seit
    24.09.2010
    Beiträge
    91

    Standard

    Und schon beim nächsten Aufruf von document() mache ich offenbar wieder etwas falsch. Mein XSL lautet nun (gekürzt)

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      xmlns:xl="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
      exclude-result-prefixes="xs" version="2.0">
    
        <!-- Funktioniert: -->
        <xsl:variable name="worksheetNumber">
          <xsl:value-of select="document('input-xlsx/xl/workbook.xml')/xl:workbook/xl:sheets/xl:sheet[@name=$worksheetName]/count(preceding-sibling::*)+1"/>
        </xsl:variable>
    
        <!-- Funktioniert nicht: -->
        <xsl:variable name="columnCount">
          <xsl:value-of select="document('input/xl/worksheets/sheet1.xml')/xl:worksheet/xl:cols/count(xl:col)"/>
        </xsl:variable>
    und das dazugehörige XML (Pfadangabe stimmt, gekürzt) ist

    Code:
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
      xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac"
      xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">
      <dimension ref="A1:C4"/>
      <sheetViews>
        <sheetView showGridLines="0" tabSelected="1" workbookViewId="0">
          <pane ySplit="1" topLeftCell="A2" activePane="bottomLeft" state="frozen"/>
          <selection pane="bottomLeft" activeCell="A2" sqref="A2"/>
        </sheetView>
      </sheetViews>
      <sheetFormatPr defaultColWidth="12.7109375" defaultRowHeight="12.75" x14ac:dyDescent="0.2"/>
      <cols>
        <col min="1" max="1" width="4.7109375" customWidth="1"/>
        <col min="2" max="2" width="7.28515625" customWidth="1"/>
        <col min="3" max="3" width="25.5703125" bestFit="1" customWidth="1"/>
      </cols>
    </worksheet>
    Die Namespaces stimmen, die Syntax zeigt für mich keinen Unterschied ... erleuchtet mich! ))
    --
    Cheers Vince

 

 

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •