Eigentlich muesste es so funktionieren:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xalan" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:exslt="http://exslt.org/common" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" exclude-result-prefixes="office exslt xalan table text">
<xsl:output method="xml" indent="yes" encoding="UTF-8" omit-xml-declaration="no"/>
<xsl:param name="targetURL"/>
<xsl:strip-space elements="*"/>
<!-- 1. Schritt -->
<xsl:template match="/">
<datasheet>
<xsl:apply-templates select="//table:table[1]"/>
<!-- Nur 1. Tabellenblatt verwenden! -->
</datasheet>
</xsl:template>
<!-- 2. Schritt -->
<xsl:template match="table:table">
<xsl:for-each select="table:table-row">
<xsl:variable name="AdjustedTableRow">
<table:table-row>
<!-- soweit ich gesehen habe benoetigst du nur die table:table-cell, beachte, dass gruppiereungen in spreadseets unterelemente erzeugte -->
<xsl:call-template name="CleanUpRow"/>
</table:table-row>
</xsl:variable>
<xsl:choose>
<xsl:when test="function-available('xalan:nodeset')">
<xsl:apply-templates select="xalan:nodeset($AdjustedTableRow)/*" mode="Adjusted"/>
</xsl:when>
<xsl:when test="function-available('exslt:node-set')">
<xsl:apply-templates select="exslt:node-set($AdjustedTableRow)/*" mode="Adjusted"/>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:template>
<!-- 2.1. Schritt -->
<xsl:template name="CleanUpRow">
<xsl:for-each select="table:table-cell">
<!-- erstelle bereinigte zeile -->
<table:table-cell>
<xsl:for-each select="@*[not(local-name() = 'number-columns-spanned')]">
<xsl:attribute name="{name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:for-each>
<!-- kopiere all unterelemente -->
<xsl:copy-of select="*"/>
</table:table-cell>
<!-- ueberpruefe ob columns repeated besteht -->
<xsl:if test="@table:number-columns-spanned">
<!-- erstelle leere table-cell elemente -->
<xsl:call-template name="CreateDummyCell">
<xsl:with-param name="Number" select="@table:number-columns-spanned - 1"/>
</xsl:call-template>
</xsl:if>
</xsl:for-each>
</xsl:template>
<!-- 2.1.1. Schritt -->
<xsl:template name="CreateDummyCell">
<xsl:param name="Number"/>
<xsl:if test="$Number > 0">
<table:table-cell/>
<xsl:call-template name="CreateDummyCell">
<xsl:with-param name="Number" select="$Number - 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<!-- 3. Schritt -->
<xsl:template match="table:table-row" mode="Adjusted">
<xsl:variable name="cName" select="1"/>
<xsl:variable name="cMaster" select="3"/>
<xsl:variable name="cLang" select="12"/>
<record>
<Name>
<xsl:value-of select="table:table-cell[$cName]/text:p"/>
</Name>
<Master>
<xsl:value-of select="table:table-cell[$cMaster]/text:p"/>
</Master>
<Sprache>
<xsl:value-of select="table:table-cell[$cLang]/text:p"/>
</Sprache>
</record>
</xsl:template>
</xsl:stylesheet>