<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dtb="http://www.daisy.org/z3986/2005/dtbook/" version="2.0" exclude-result-prefixes="#all"> <xsl:include href="utilities.xsl"/> <xsl:variable name="automatic-language-styles" as="element()*"> <xsl:call-template name="automatic-language-styles"> <xsl:with-param name="elements" as="element()*"> <xsl:for-each-group select="//*[self::text:p or self::text:h or self::text:span or self::text:a][@xml:lang]" group-by="@xml:lang"> <xsl:for-each-group select="current-group()" group-by="string(@text:style-name)"> <xsl:for-each-group select="current-group()" group-by="style:family(.)"> <xsl:sequence select="current-group()[1]"/> </xsl:for-each-group> </xsl:for-each-group> </xsl:for-each-group> </xsl:with-param> <xsl:with-param name="existing-styles" select="//office:automatic-styles/style:style[@style:family=('paragraph','text')]"/> </xsl:call-template> </xsl:variable> <xsl:template match="/"> <xsl:apply-templates select="/*"/> </xsl:template> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="/office:document-content/office:automatic-styles"> <xsl:copy> <xsl:apply-templates/> <xsl:for-each select="$automatic-language-styles"> <xsl:sequence select="style:style"/> </xsl:for-each> <xsl:call-template name="automatic-table-styles"/> </xsl:copy> </xsl:template> <xsl:template match="text:p|text:h|text:span|text:a"> <xsl:choose> <xsl:when test="@xml:lang"> <xsl:variable name="parent-style-name" select="string(@text:style-name)"/> <xsl:variable name="family" select="style:family(.)"/> <xsl:variable name="lang" select="@xml:lang"/> <xsl:copy> <xsl:apply-templates select="@*[not(name(.)='xml:lang')]"/> <xsl:attribute name="text:style-name" select="$automatic-language-styles[@xml:lang=$lang] /style:style[@style:family=$family and string(@style:parent-style-name)=$parent-style-name] /@style:name"/> <xsl:apply-templates select="node()"/> </xsl:copy> </xsl:when> <xsl:otherwise> <xsl:next-match/> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="table:table"> <xsl:copy> <xsl:apply-templates select="@*"/> <xsl:attribute name="table:style-name" select="style:name(@table:name)"/> <xsl:apply-templates select="node()"/> </xsl:copy> </xsl:template> <xsl:template match="table:table-column"> <xsl:copy> <xsl:apply-templates select="@*"/> <xsl:attribute name="table:style-name" select="concat(style:name(parent::table:table/@table:name), '.A')"/> <xsl:apply-templates select="node()"/> </xsl:copy> </xsl:template> <xsl:template name="automatic-language-styles" as="element()*"> <xsl:param name="elements" as="element()*"/> <xsl:param name="existing-styles" as="element()*"/> <xsl:if test="exists($elements)"> <xsl:variable name="element" select="$elements[1]"/> <xsl:variable name="family" select="style:family($element)"/> <xsl:variable name="style" as="element()?"> <xsl:element name="language-style"> <xsl:attribute name="xml:lang" select="$element/@xml:lang"/> <xsl:element name="style:style"> <xsl:attribute name="style:name"> <xsl:call-template name="generate-automatic-style-name"> <xsl:with-param name="existing-style-names" select="$existing-styles/style:style[@style:family=$family]/@style:name"/> <xsl:with-param name="prefix" select="if ($family='paragraph') then 'P' else 'T'"/> </xsl:call-template> </xsl:attribute> <xsl:attribute name="style:family" select="$family"/> <xsl:if test="$element/@text:style-name"> <xsl:attribute name="style:parent-style-name" select="$element/@text:style-name"/> </xsl:if> <xsl:element name="style:text-properties"> <xsl:call-template name="language-properties"> <xsl:with-param name="lang" select="$element/@xml:lang"/> </xsl:call-template> </xsl:element> </xsl:element> </xsl:element> </xsl:variable> <xsl:sequence select="$style"/> <xsl:call-template name="automatic-language-styles"> <xsl:with-param name="elements" select="$elements[position() > 1]"/> <xsl:with-param name="existing-styles" select="($existing-styles, $style)"/> </xsl:call-template> </xsl:if> </xsl:template> <xsl:template name="automatic-table-styles"> <xsl:for-each select="//table:table"> <xsl:element name="style:style"> <xsl:attribute name="style:name" select="style:name(@table:name)"/> <xsl:attribute name="style:display-name" select="@table:name"/> <xsl:attribute name="style:family" select="'table'"/> </xsl:element> <xsl:element name="style:style"> <xsl:attribute name="style:name" select="concat(style:name(@table:name), '.A')"/> <xsl:attribute name="style:display-name" select="concat(@table:name, '.A')"/> <xsl:attribute name="style:family" select="'table-column'"/> </xsl:element> </xsl:for-each> </xsl:template> </xsl:stylesheet>