我不时做XSLT。所以我可能对此一无所知。
不确定是否需要一个例子,但这里是: XML非常简单:
<a></a>
XSL:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
<xsl:apply-templates select="a"/>
</xsl:template>
<xsl:template match="a">
<html>
<head>
<title>Title</title>
</head>
<body><br></body>
</html>
</xsl:template>
</xsl:stylesheet>
Java代码:
public static String transform(String xml, String xsl) throws TransformerException {
StreamSource xslT = new StreamSource(new StringReader(xsl));
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer(xslT);
StreamSource source = new StreamSource(new StringReader(xml));
StringWriter out = new StringWriter();
StreamResult result = new StreamResult(out);
transformer.transform(source, result);
return out.toString();
}
我认为如果我在样式表中使用html
作为输出类型,那么它应该将<br>
识别为有效的html标记。
一般而言......为什么它完全关心HTML有效性?我还注意到,如果我声明一个变量。 E.g:
<xsl:variable name="someTable">
<table class="common" bgcolor="#DDDDDD">
</xsl:variable>
将报告相同的错误。
我的目标不是创建无效的HTML。我只是想声明一个变量(I&#39; ll关闭<table>
,具体取决于稍后的处理逻辑。)
有没有办法解决这个问题,或者我必须使用text
作为输出类型。
答案 0 :(得分:3)
如果输出方法为html
,则处理器将<br/>
输出为<br>
。但是,输入和样式表都必须是格式良好的 XML 文档。
关于变量的问题:您不能在变量中仅存储开始标记。您必须存储整个元素(此时此元素仅作为抽象存在,并且没有标记)。
如果您发现自己“需要”存储一个“关闭的开始标记,具体取决于以后某处的处理逻辑”,那么您需要重新考虑您的方法。这不是找到解决方法的问题;这不是XSLT的工作原理。
答案 1 :(得分:3)
XSLT是一种将源树转换为结果树的语言。忘记标签和标记;它们是肤浅的,它们只是在屏幕显示上显示树木的便捷方式。源文档是树,样式表是树,结果文档是树。一个元素节点,其名称为&#34; br&#34;没有属性,没有子项在XML表示法中显示为<br/>
,在HTML表示法中显示为<br>
,但对于XSLT则没有区别。
根据稍后某处的处理逻辑,您无法关闭[标签]&#34;。首先,XSLT是一种功能语言,没有处理顺序的概念,因此没有&#34;后来&#34;的概念。其次,树上的节点是不可分割的对象,您可以一次创建它,它不具有可以在不同时间创建的单独的开始和结束。
当您在XSLT中阅读时:
<p>
<xsl:value-of select="XXXX"/>
</p>
您可能会将其视为三个操作的序列(编写开始标记,编写文本内容,编写结束标记)。但那根本不是正确的处理模式。此XSLT片段中有两个元素节点,一个p
元素和一个xsl:value-of
元素;因此有两条指令:p
指令将p
元素写入结果树,以及xsl:value-of
指令将文本节点写入结果树。
答案 2 :(得分:2)
任何XSLT样式表都必须是格式良好的命名空间XML文档,使用XML时,如果没有结束<br>
,则不能有</br>
。当然,您可以在XML中使用<br/>
而不是<br></br>
。