我正在尝试将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**
由于
答案 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标签被视为文本。