将xml转换为html

时间:2011-02-15 17:35:27

标签: xslt

我正在尝试将xml文档转换为html。 locgic很简单,包括childnode在内的所有节点都将按顺序显示。很少有节点包含html标签,我想保留它们,以便格式化将在html中工作。

所以我有xml文件:

       <?xml version="1.0" encoding="UTF-8"?>
           <para class="para">
                <table style="1">
                  <col width="50*"/>
                  <col align="right" width="25*"/>
                  <col align="right" width="25*"/>
                  <thead>
                    <tr>
                      <th>
                        <text class="text">xyz</text>
                      </th>
                      <th>
                        <text class="text">Abc</text>
                      </th>
                     </tr>
                  </thead>
                  <tr>
                    <td>
                      <text class="text">2,000 Common</text>
                    </td>
                    <td>
                      <text class="text">($200.00)</text>
                    </td>
                    </tr>
                </table>
               </para>
           <para class="para">
               <div>Some Text 
                   <product><b>this should be in bold</b></product>
              </div>
            </para>

我已经编写了xsl脚本:

<xsl:template name="para" >
<xsl:for-each select="child::text()|child::node()" >
  <xsl:if test ="node()">
    <xsl:if test="text()">
              <xsl:value-of select="text()"/>
          <br/>
          <br/>
      </xsl:if>
    <xsl:call-template name="para"></xsl:call-template>
  </xsl:if>
</xsl:for-each>

问题在于它还将html标签视为节点,并将其呈现在标签内的值上。我想在html输出中保留这些标签的位置。父节点“para”可以具有多个子节点和子节点,因此不需要通用解决方案。输出应为

        <table>
        <tr>
        <td>
        xyz
        </td>
        <td>
        abc
        </td>
        </tr>
        <tr>
        <td>
         2,000 Common      
        </td>
        <td>
        ($200.00)
        </td>
        </tr>
       </table>

       Some Text 

       **this should be in bold**

由于

3 个答案:

答案 0 :(得分:2)

此转化:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="t|para|col|text|product">
  <xsl:apply-templates/>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档(包装在top元素中以使其格式正确):

<t>
    <para class="para">
        <table style="1">
            <col width="50*"/>
            <col align="right" width="25*"/>
            <col align="right" width="25*"/>
            <thead>
                <tr>
                    <th>
                        <text class="text">xyz</text>
                    </th>
                    <th>
                        <text class="text">Abc</text>
                    </th>
                </tr>
            </thead>
            <tr>
                <td>
                    <text class="text">2,000 Common</text>
                </td>
                <td>
                    <text class="text">($200.00)</text>
                </td>
            </tr>
        </table>
    </para>
    <para class="para">
        <div>Some Text                     
            <product>
                <b>this should be in bold</b>
            </product>
        </div>
    </para>
</t>

会产生想要的正确结果:

<table style="1">
    <thead>
        <tr>
            <th>xyz</th>
            <th>Abc</th>
        </tr>
    </thead>
    <tr>
        <td>2,000 Common</td>
        <td>($200.00)</td>
    </tr>
</table>
<div>Some Text                     
            <b>this should be in bold</b>
</div>

解释:这是“覆盖身份规则”设计模式的简单应用。

答案 1 :(得分:1)

如果您希望HTML按原样传递,那么您应该考虑将它们放在与XML其余部分不同的命名空间中。 W3C甚至为各种版本的(X)HTML定义了一系列名称空间,您可以将其用于此目的。

答案 2 :(得分:0)

您可以使用命名空间 - 创建命名空间并将所有非html节点放入此命名空间。

比在xslt中只选择给定命名空间中的节点 - 这会让你的html标签被视为文本。