如何使javax Transformer输出HTML(没有自闭合标签)?

4
我正在使用javax.xml.transform.Transformer将XML文件转换为HTML文件。可能会出现div没有内容的情况,这会导致Transformer输出<div/>,从而破坏渲染。
我搜索并发现 "您可以将xslt输出更改为html而不是xml,以避免自闭合标签问题",但那是针对另一个工具的,我想知道:我如何使用javaxTransformer来实现
3个回答

5
看起来您是按照正常方式创建了转换器,然后使用Transformer.setOutputPropertyMETHOD属性设置为"html"
例如:
private static final DocumentBuilderFactory sDocumentFactory;
private static DocumentBuilder sDocumentBuilder;
private static DOMImplementation sDomImplementation;

private static final TransformerFactory sTransformerFactory =
  TransformerFactory.newInstance();
private static Transformer sTransformer;

static {
  sDocumentFactory = DocumentBuilderFactory.newInstance();

  sDocumentFactory.setNamespaceAware( true );
  sDocumentFactory.setIgnoringComments( true );
  sDocumentFactory.setIgnoringElementContentWhitespace( true );

  try {
    sDocumentBuilder = sDocumentFactory.newDocumentBuilder();
    sDomImplementation = sDocumentBuilder.getDOMImplementation();
    sTransformer = sTransformerFactory.newTransformer();

    sTransformer.setOutputProperty( OMIT_XML_DECLARATION, "yes" );
    sTransformer.setOutputProperty( INDENT, "no" );
    sTransformer.setOutputProperty( METHOD, "html" );
  } catch( final Exception ex ) {
    ex.printStackTrace();
  }
}

1
我已经在xsl和Java代码中都设置了,但似乎被忽略了。 :-( - KlaymenDK

0

这个另一个线程中的答案在我的情况下似乎不起作用;即使我指定了<xsl:output method="html"...>,它仍然会产生<div/>而不是<div></div>

我不知道我的IDE或编译器是否有问题(IBM Rational Application Developer),但我正在使用检测空节点并在其中插入单个空格的解决方法。不太干净,但有效...


0

使用XSLT输出有效的HTML的方法是使用<xsl:output>指令,并将其method属性设置为html

这里有一个小例子:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="html"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     <div>
       <xsl:apply-templates select="x/y/z"/>
     </div>
 </xsl:template>

</xsl:stylesheet>

当这个转换应用于以下XML文档时

<t/>

期望的结果已生成(我正在使用8个不同的XSLT处理器,它们都生成了相同的结果):

<div></div>

如果不需要的输出仅与特定的XSLT处理器发生,则这是该特定处理器的实现问题,更多地是一个“xsltprocessors”而不是“xslt”的问题。

感谢您再次调整标签。我相信我最终会学会的。 :-) - KlaymenDK
如上所述,无论我在代码中、模板中指定“html 输出”还是根本不指定,它似乎都会产生相同的输出。 :-( 如果这真的是 javax.xml.transform.Transformer 中的 bug(虽然这似乎不太可能),我该怎么办? - KlaymenDK
@KlaymenDK:一些XSLT处理器要求用户实现一个通常称为“XSLTWriter”的类,该类控制精确的序列化。此外,一些处理器需要其他设置才能遵守<xsl:output>method属性的值。请阅读您的XSLT处理器文档。不幸的是,我的答案无法涵盖每个XSLT处理器的具体细节。它提供了从XSLT方面所需的内容。您有文档,这变成了一个非常具体的问题,不是关于XSLT语言本身,而是关于特定的XSLT处理器。 - Dimitre Novatchev
非常感谢您的指导。这对我来说都是新的领域,所以我不确定哪个组件可能对应于我的编码中的某个错误。我将深入研究文档。(顺便说一句,我正在使用内置的Java库在Eclipse中工作。) - KlaymenDK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接