I found the solution. Not sure if this is the most elegant, or if anyone cares, but here are the templates I used to accomplish this transformation:
Code:
<xsl:template match="node()[contains(name(), 'ordered-list') and not(contains(name(preceding-sibling::node()[1]), 'ordered-list'))]">
<xsl:variable name="level" select="count(ancestor::node()[contains(name(), 'ordered-list')])+1"/>
<xsl:choose>
<xsl:when test="not(parent::text:list-item[1])">
<Dog_List>
<xsl:choose>
<xsl:when test="name() = 'text:unordered-list'">
<Dog_UnorderedList><xsl:apply-templates/></Dog_UnorderedList>
</xsl:when>
<xsl:when test="name() = 'text:ordered-list' and (@text:style-name = 'Dog_SimpleList' or @text:style-name = //text:list-style[text:list-level-style-number[@text:level = $level and @style:num-format = '']]/@style:name)">
<Dog_SimpleList><xsl:apply-templates/></Dog_SimpleList>
</xsl:when>
<xsl:otherwise>
<Dog_OrderedList>
<xsl:if test="contains(@text:style-name, 'LowerAlpha') or @text:style-name = //text:list-style[text:list-level-style-number[@text:level = $level and @style:num-format = 'a']]/@style:name">
<Dog_OrderedListType>alpha</Dog_OrderedListType>
</xsl:if>
<xsl:if test="contains(@text:style-name, 'UpperAlpha') or @text:style-name = //text:list-style[text:list-level-style-number[@text:level = $level and @style:num-format = 'A']]/@style:name">
<Dog_OrderedListType>ucase</Dog_OrderedListType>
</xsl:if>
<xsl:apply-templates/>
</Dog_OrderedList>
</xsl:otherwise>
</xsl:choose>
</Dog_List>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="name() = 'text:unordered-list'">
<Dog_UnorderedList><xsl:apply-templates/></Dog_UnorderedList>
</xsl:when>
<xsl:when test="name() = 'text:ordered-list' and (@text:style-name = 'Dog_SimpleList' or @text:style-name = //text:list-style[text:list-level-style-number[@text:level = $level and @style:num-format = '']]/@style:name)">
<Dog_SimpleList><xsl:apply-templates/></Dog_SimpleList>
</xsl:when>
<xsl:otherwise>
<Dog_OrderedList>
<xsl:if test="contains(@text:style-name, 'LowerAlpha') or @text:style-name = //text:list-style[text:list-level-style-number[@text:level = $level and @style:num-format = 'a']]/@style:name">
<Dog_OrderedListType>alpha</Dog_OrderedListType>
</xsl:if>
<xsl:if test="contains(@text:style-name, 'UpperAlpha') or @text:style-name = //text:list-style[text:list-level-style-number[@text:level = $level and @style:num-format = 'A']]/@style:name">
<Dog_OrderedListType>ucase</Dog_OrderedListType>
</xsl:if>
<xsl:apply-templates/>
</Dog_OrderedList>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="text:list-item[not(ancestor::text:list-item[not(node())])]">
<xsl:choose>
<xsl:when test="text:p">
<xsl:variable name="ancestorList" select="ancestor::node()[contains(name(), 'ordered-list') and not(ancestor::text:ordered-list or ancestor::text:unordered-list)]"/>
<xsl:variable name="level" select="count(ancestor::text:ordered-list | ancestor::text:unordered-list)"/>
<xsl:choose>
<xsl:when test="not(following-sibling::text:list-item) and (text:p or text:a)">
<Dog_ListItem>
<xsl:apply-templates/>
<!-- If there is another list following my ancestor and it has an empty list item at
the same level as me, it means that this list was created to house a child of mine -->
<xsl:apply-templates select="$ancestorList/following-sibling::node()[contains(name(), 'ordered-list')][1]/descendant::text:list-item[count(ancestor::node()[contains(name(), 'ordered-list')]) = $level and not(text:p)]/node()"/>
</Dog_ListItem>
<!-- Ok, if I am a sibling of someone above me, I will go ahead and
let him parse the rest of siblings below me, otherwise I will parse
them -->
<xsl:if test="not($ancestorList/preceding-sibling::node()[contains(name(), 'ordered-list') and generate-id(following-sibling::node()[not(contains(name(), 'ordered-list'))]) = generate-id($ancestorList/following-sibling::node()[not(contains(name(), 'ordered-list'))])]/descendant::text:list-item[count(ancestor::text:ordered-list | ancestor::text:unordered-list) = $level and text:p and not(ancestor::text:list-item[text:p])])">
<xsl:for-each select="$ancestorList/following-sibling::node()[contains(name(), 'ordered-list') and generate-id(following-sibling::node()[not(contains(name(), 'ordered-list'))]) = generate-id($ancestorList/following-sibling::node()[not(contains(name(), 'ordered-list'))])]/descendant::text:list-item[count(ancestor::text:ordered-list | ancestor::text:unordered-list) = $level and text:p and not(ancestor::text:list-item[text:p])]">
<xsl:variable name="currentAncestor" select="ancestor::node()[contains(name(), 'ordered-list') and not(ancestor::text:ordered-list or ancestor::text:unordered-list)]"/>
<xsl:if test="not($currentAncestor/preceding-sibling::node()[preceding-sibling::node()[generate-id() = generate-id($ancestorList)]]/descendant::text:list-item[count(ancestor::text:ordered-list | ancestor::text:unordered-list) < $level and text:p])">
<xsl:apply-templates select="."/>
</xsl:if>
</xsl:for-each>
</xsl:if>
</xsl:when>
<xsl:otherwise>
<Dog_ListItem><xsl:apply-templates/></Dog_ListItem>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:template>