У вас проблема с вложенными xsl:for-each
утверждениями.Второй не будет ничего выбирать ...
<xsl:for-each select="document/item">
<xsl:for-each select="document/item/richtext">
Это потому, что первый xsl:for-each
выбирает элемент item
, и поэтому ваш вложенный оператор xsl:for-each
будет относительно этогоitem
элемент.Другими словами, он ищет дочерний элемент с именем document
, которого явно не существует.
На самом деле эти первые два утверждения вам вообще не нужны.Вы можете просто использовать третий для непосредственного получения элементов.
<xsl:for-each select="document/item/richtext/mytable">
Та же проблема с выбором дочерних узлов относится и к остальным вашим операторам xsl:for-each
.Так, например, чтобы выбрать строки, вы должны сделать это ...
<xsl:for-each select="myrow">
Попробуйте это XSLT
<xsl:template match="/">
<xsl:for-each select="document/item/richtext/mytable">
<table border = "1">
<xsl:for-each select="myrow">
<tr>
<xsl:for-each select="mycol">
<td>
<xsl:value-of select="."/>
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</xsl:for-each>
</xsl:template>
Однако, если вы намереваетесь сделать больше XSLT, вы можете захотетьрассмотреть возможность использования подхода, который использует шаблоны.Не то, чтобы была какая-либо проблема с операторами for-each, но в этом случае это помогло бы уменьшить вложенность и размер блоков кода.
Попробуйте также этот XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes" html-version="5"/>
<xsl:template match="/">
<xsl:apply-templates select="document/item/richtext/mytable" />
</xsl:template>
<xsl:template match="mytable">
<table border = "1">
<xsl:apply-templates select="myrow" />
</table>
</xsl:template>
<xsl:template match="myrow">
<tr>
<xsl:apply-templates select="mycol" />
</tr>
</xsl:template>
<xsl:template match="mycol">
<td>
<xsl:value-of select="."/>
</td>
</xsl:template>
</xsl:stylesheet>
Иесли вы хотите включить атрибут colspan
, измените соответствующий шаблон mycol на этот ...
<xsl:template match="mycol">
<td>
<xsl:copy-of select="@colspan" />
<xsl:value-of select="."/>
</td>
</xsl:template>