Announcement

Collapse
No announcement yet.

XSL document() debuggen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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
    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.

    Comment


    • #3
      Aha!

      Originally posted by Martin Honnen View Post
      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

      Comment


      • #4
        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

        Comment

        Working...
        X