为什么我必须在XSL中关闭<br/>标签?

时间:2016-10-12 20:12:04

标签: java html xslt tags

我不时做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作为输出类型。

3 个答案:

答案 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>