我一直在做很多工作,试图弄清楚如何使用样式表查看XML文件(在Internet Explorer上),并保留文档中的回车/换行符。
我确实做到了,但是不想在我的XML文件中都使用[br /]的CDATA。我希望在XML文本文件中使用保存的回车符。
我看到了其他示例,例如:how to convert NEWLINE into <BR/> with XSLT?,但是我不太擅长XML / XSL,无法弄清楚如何使其正确工作。我所做的一切都放置了“&lt; br /&gt;”或CR / LF,但不是浏览器可以理解的
。
XSL文件:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body style="font-family:verdana;">
<h2>Example</h2>
<table border="1" bordercolor="#000000" cellspacing="0">
<tr bgcolor="#000000" style="color:#FFFFFF;text-align:left;font-size:80%">
<th>#</th>
<th>Has <![CDATA["CDATA[<br/>]"]]> (It Works)</th>
<th>Has <![CDATA["
"]]> (Want this one as worst case)</th>
<th>Has Carriage Return (Want this one to work)</th>
</tr>
<xsl:for-each select="report/test">
<tr style="text-align:left;font-size:80%">
<xsl:choose>
<xsl:when test="@type = 'append_text'">
<td><b><xsl:value-of select="text"/></b></td>
</xsl:when>
<xsl:when test="@type = 'test_step'">
<td id="ref{num}"><xsl:value-of select="num"/></td>
<td><xsl:value-of select="hasBR" disable-output-escaping="yes"/></td>
<td><xsl:value-of select="hasXA" disable-output-escaping="yes"/></td>
<td><xsl:value-of select="hasCR" disable-output-escaping="yes"/></td>
</xsl:when>
</xsl:choose>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
XML文件:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="51380-200.xsl"?>
<report>
<test type="test_step">
<num>1</num>
<hasXA>Line 1 
 Line 2 
 Line 3</hasXA>
<hasBR>Line 1 <![CDATA[<br/>]]> Line 2 <![CDATA[<br/>]]> Line 3</hasBR>
<hasCR>Line 1
Line2
Line3</hasCR>
</test>
<test type="test_step">
<num>2</num>
<hasXA>Line 1 
 Line 2 
 Line 3</hasXA>
<hasBR>Line 1 <![CDATA[<br/>]]> Line 2 <![CDATA[<br/>]]> Line 3</hasBR>
<hasCR>Line 1
Line2
Line3</hasCR>
</test>
<test type="test_step">
<num>3</num>
<hasXA>Line 1 
 Line 2 
 Line 3</hasXA>
<hasBR>Line 1 <![CDATA[<br/>]]> Line 2 <![CDATA[<br/>]]> Line 3</hasBR>
<hasCR>Line 1
Line2
Line3</hasCR>
</test>
</report>
非常感谢您的帮助!
注意,我一直在使用XSL transform.net尝试使其工作。我在上面加载了一个版本。 http://xsltransform.net/bESZULX
答案 0 :(得分:0)
假设您可能想要这样的东西:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body style="font-family:verdana;">
<h2>Example</h2>
<table border="1" bordercolor="#000000" cellspacing="0">
<tr bgcolor="#000000" style="color:#FFFFFF;text-align:left;font-size:80%">
<th>#</th>
<th>Has <![CDATA["CDATA[<br/>]"]]> (It Works)</th>
<th>Has <![CDATA["
"]]> (Want this one as worst case)</th>
<th>Has Carriage Return (Want this one to work)</th>
</tr>
<xsl:for-each select="report/test">
<tr style="text-align:left;font-size:80%">
<xsl:choose>
<xsl:when test="@type = 'append_text'">
<td><b><xsl:value-of select="text"/></b></td>
</xsl:when>
<xsl:when test="@type = 'test_step'">
<td id="ref{num}"><xsl:value-of select="num"/></td>
<td><xsl:value-of select="hasBR" disable-output-escaping="yes"/></td>
<td><xsl:value-of select="hasXA" disable-output-escaping="yes"/></td>
<td>
<xsl:call-template name="insertBreaks">
<xsl:with-param name="pText" select="hasCR" />
</xsl:call-template>
</td>
</xsl:when>
</xsl:choose>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="hasCR" name="insertBreaks">
<xsl:param name="pText" select="." />
<xsl:choose>
<xsl:when test="not(contains($pText, '
'))">
<xsl:copy-of select="$pText" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="substring-before($pText, '
')" />
<br />
<xsl:call-template name="insertBreaks">
<xsl:with-param name="pText" select="substring-after($pText, '
')" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
让我们解决问题。
您正在生成HTML。它有关于保留渲染时换行符的规则:在td
元素内,您需要一个br
元素。
您有一个XML文档。没有什么可以阻止您使用混合内容。示例:
<hasBR>Line 1 <br />Line 2 <br />Line 3</hasBR>
如果您不打算对混合内容进行任何其他处理,那么最好的解决方案就是将其复制。因此,代替
<td><xsl:value-of select="hasBR" disable-output-escaping="yes"/></td>
...使用xsl:copy-of
指令,如
<td><xsl:copy-of select="hasBR/node()"/></td>
注意:如果您使用identity transformation模式,则可以继续处理混合内容。混合两个XML词汇表时,还必须非常注意名称空间。
最后,如果您的XML输入文档无法从混合内容中受益,那么您始终可以使用递归模板来处理字符串值,例如@Vebbie答案。对于XSLT的较新版本,有更好的解决方案。