我目前正在努力解决XML / XLST到HTML的转换问题。
简而言之,我想在XML标记中使用<br />
标记,以便转换后的HTML文件将显示换行符。经过一些尝试,我得到了它的工作,但是以一些其他功能为代价。即突出部分的能力。
首先是转储的XML文件。基本上,有几个可能的标签都包含名字和姓氏。在这种情况下,我希望在单独的行上解析名字和姓氏(因此<br />
标记)。此外,在某些情况下,需要突出显示名字或姓氏。在这种情况下,在第3行,姓氏“The Hand”。
<swift_native>
<tag tag_code=":1:"><![CDATA[Jaco<br />Ronnie]]></tag>
<tag tag_code=":2:"><![CDATA[John<br />Doe]]></tag>
<tag tag_code=":2:"><![CDATA[Robbie<br />]]><highlight>The Hand</highlight></tag>
</swift_native>
到目前为止,根据我在XLST中使用的方法,我可以使换行符正确或突出显示。但不是两个:下图显示了这一点。
您可以在下面看到使用过的XLST文件。在哪里可以看到使用<xsl:apply-templates/>
将突出显示工作,<xsl:value-of select="." disable-output-escaping="yes"/>
将让我正确使用<br />
。
<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- HTML Layout definition -->
<xsl:output method="html"/>
<xsl:template match="swift_native">
<html>
<head>
<title>
<xsl:apply-templates select="message_id"/>
</title>
<style type="text/css">
#tbl1,#tbl2 {display:none;}
#lnk1,#lnk2 {border:none;background:none;width:85px;}
td {FONT-SIZE: 75%; MARGIN: 0px; COLOR: #000000;}
td {FONT-FAMILY: verdana,helvetica,arial,sans-serif}
a {TEXT-DECORATION: none;}
table.subtable {border-collapse:collapse;}
table.subtable td {border:1px solid black;}
</style>
</head>
<body>
<table cellpadding="3" width="100%" class="subtable">
<tr bgcolor="#cccccc">
<td colspan="3">Block4</td>
</tr>
<xsl:apply-templates select="tag" />
</table>
</body>
</html>
</xsl:template>
<!-- Variable definition -->
<xsl:template match="tag">
<tr>
<td>
<b>
<xsl:value-of select="@tag_code" />
</b>
</td>
<td>
<xsl:value-of select="." disable-output-escaping="yes"/>
</td>
<td>
<xsl:apply-templates/>
</td>
</tr>
</xsl:template>
<xsl:template match="highlight">
<span style="background-color:yellow;">
<xsl:apply-templates/>
</span>
</xsl:template>
</xsl:stylesheet>
显然,问题是:有人知道我可以使用<br />
标签作为突出显示的方式吗?
答案 0 :(得分:2)
CDATA
告诉处理器将内容解释为纯文本,而不是标记。这就是为什么disable-output-escaping
需要阻止<br/>
显示为<br/>
的原因。
如果你想利用disable-output-escaping
,你必须打破你对标签内容选择的方式。
添加模板
<xsl:template match="tag/text()">
<xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:template>
并将value-of
行更改为
<xsl:apply-templates select="text()|*"/>
答案 1 :(得分:1)
这里的一个解决方案是使用两者:
<xsl:template match="tag">
<tr>
<td>
<b>
<xsl:value-of select="@tag_code" />
</b>
</td>
<td>
<xsl:apply-templates/>
</td>
</tr>
</xsl:template>
<xsl:template match="tag//text()">
<xsl:value-of select="." disable-output-escaping="yes" />
</xsl:template>
<xsl:template match="highlight">
<span style="background-color:yellow;">
<xsl:apply-templates />
</span>
</xsl:template>
但请注意,如果执行此操作,则需要确保<tag>
节点中的任何文本值都在CDATA中正确转义,并且双重在其外部转义,即而不是
<tag tag_code=":2:"><![CDATA[Robbie & Bobbie <br />]]><highlight> & The Hand</highlight></tag>
你需要:
<tag tag_code=":2:"><![CDATA[Robbie & Bobbie<br />]]><highlight> &amp; The Hand</highlight></tag>
如果<tag>
元素有可能包含XML特殊字符,那么这可能不是一个好方法。
如果您可以确保<tag>
正下方的文字总是在CDATA中,并且下级节点中的任何内容(例如<highlight>
s)都不会,然后它稍微简单一些。您可以使用以下文本替换上面的文本匹配模板:
<xsl:template match="tag/text()">
<xsl:value-of select="." disable-output-escaping="yes" />
</xsl:template>
然后你需要确保CDATA中的内容被正确转义,其他任何东西都只是有效的XML。
最后,如果您对源数据有一定的控制权,则应考虑放弃CDATA并在<br />
中只有<tag>
权限:
<tag tag_code=":2:">Robbie<br /><highlight>The Hand</highlight></tag>
然后你可以使用这个XSL,它比使用disable-output-escaping
的任何东西都强大得多:
<xsl:template match="tag">
<tr>
<td>
<b>
<xsl:value-of select="@tag_code" />
</b>
</td>
<td>
<xsl:apply-templates/>
</td>
</tr>
</xsl:template>
<xsl:template match="tag/@* | tag/node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="highlight">
<span style="background-color:yellow;">
<xsl:apply-templates />
</span>
</xsl:template>
答案 2 :(得分:0)
令人高兴的是,这也是一个简单的解决方案。只需将此行添加到xls:
<xsl:template match="br"><br/></xsl:template>
这样,没有必要将数据包装到CDATA中,而是使用更直观的
<tag tag_code=":1:">Jaco<br/>Ronnie</tag>
同样可以包括其他常见的简单html标签。这里有一个将粗体,斜体等与cs样式相关联的示例,但每个样本(如上所述)的单行也可以使用:
<xsl:template match="i|b|u|strong">
<span>
<xsl:attribute name="class">html_<xsl:value-of select="name(.)" /></xsl:attribute>
<xsl:apply-templates />
</span>
</xsl:template>
如果您发现自己经常这样做,请将所有内容复制到html.xsl并使用xsl:include
在需要时使用它们。
答案 3 :(得分:-1)
简单
html中的是:
</br>
XLS中的是:
<br></br>