Я делаю преобразование XAML в HTML, и я не установил достаточно хорошо, чтобы соответствовать элементам с произвольными атрибутами и как обрабатывать последовательные списки элементов, которые могут иметь разные структуры ниже них, так что
<paragraph fontfamily="times">
<run></run>
<list></list>
</paragraph>
<paragraph fontsize="16">
<run></run>
<run></run>
</paragraph>
превратится в
<p><span></span><ul></ul></p>
<p><span></span><span></span></p>
XSLT - это язык, основанный на вершинах селекторов XPATH.
В декларативном стиле
<xsl:template match="/">
<xsl:apply-templates select="/paragraph"/>
</xsl:template>
<xsl:template match="paragraph">
<p>
<xsl:apply-templates select="run"/>
<xsl:apply-templates select="list"/>
</p>
</xsl:template>
<xsl:template match="paragraph/list">
<ul>
...
</ul>
</xsl:template>
<xsl:template match="paragraph/run">
<span>
...
</span>
</xsl:template>
Также вы можете написать его в императивном стиле
<xsl:template match="/">
<xsl:apply-templates select="/paragraph"/>
</xsl:template>
<xsl:template match="paragraph">
<p>
<xsl:for-each select="run">
<span>
...
</span>
</xsl:for-each>
<xsl:for-each select="list">
<ul>
...
</ul>
</xsl:for-each>
</p>
</xsl:template>