xsl 1.0 xml表到html表,替换空节点

时间:2014-01-20 13:09:50

标签: xml xslt

我有一个如下所示的XML表:

<!-- language: lang-xml -->

<table frame="all" colsep="1" rowsep="1">
  <tgroup>
    <colspec colname="col0" colwidth="1316"/>
    <colspec colname="col1" colwidth="1316"/>
    <colspec colname="col2" colwidth="1316"/>
    <colspec colname="col3" colwidth="1316"/>
    <colspec colname="col4" colwidth="1316"/>
    <colspec colname="col5" colwidth="1316"/>
    <colspec colname="col6" colwidth="1316"/>
    <tbody>
      <row>
        <entry>
          <p/>
        </entry>
        <entry>
          <p/>
        </entry>
        <entry>
          <p/>
        </entry>
        <entry>
          <p/>
        </entry>
        <entry>
          <p/>
        </entry>
        <entry>
          <p/>
        </entry>
        <entry>
          <p/>
        </entry>
      </row>
    </tbody>
  </tgroup>
</table>

我希望它将它转换为HTML表格,我已经进行了XSL转换,但它没有复制空段落。 我想检查每个条目的内部,如果有空,则为&lt; p&gt;我想将其替换为'&lt; p&gt;&amp; nbsp;&lt; / p&gt;'如果它有一个textnode我想用&lt; p&gt;包围它还

这是条目的当前XSL:

<!-- language: lang-xsl -->

<xsl:template match="entry">
  <td>
    <xsl:for-each select="*" >
      <xsl:choose>
        <xsl:when test="self::text()[not(text()='')]" >
          <p>
            <xsl:apply-templates/>
          </p>
        </xsl:when>
        <xsl:when test="self::text()[text()='']" >
          <p>&amp;nbsp;</p>
        </xsl:when>
        <xsl:when test="text()=''" >
          <p>&amp;nbsp;</p>
        </xsl:when>
        <xsl:when test="p[not(node())]" >
          <p>&amp;nbsp;</p>
        </xsl:when>
        <xsl:otherwise>
          <xsl:apply-templates/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:for-each>
  </td>
</xsl:template>

我正在使用XSL 1.0,它没有给出我期望的结果。 基本上我得到一个空的&lt; td&gt;&lt; / td&gt;标签。 我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

查看其他模板会很有帮助。没有它,我们无法分辨这一部分的作用:

<p>
    <xsl:apply-templates/>
</p>

假设它按预期工作,请尝试类似:

<xsl:template match="entry">
    <td>
        <xsl:choose>
            <xsl:when test="p/node()">
                <xsl:apply-templates/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>   
            </xsl:otherwise>
        </xsl:choose>
    </td>
</xsl:template>

或者(不依赖于其他模板):

<xsl:template match="entry">
    <td>
        <xsl:choose>
            <xsl:when test="p/node()">
                <xsl:copy-of select="p/node()"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>   
            </xsl:otherwise>
        </xsl:choose>
    </td>
</xsl:template>

答案 1 :(得分:0)

不确定XSL的其余部分,但这部分可能有助于获得解决方案:

  <xsl:template match="entry">
    <td>
      <xsl:apply-templates />
    </td>
  </xsl:template>
  <xsl:template match="p">
    <xsl:if test="not(text())"><p>&amp;nbsp;</p></xsl:if>
    <xsl:if test="text()">
      <p><xsl:value-of select="text()" /></p>
    </xsl:if>
  </xsl:template>