XSL转换的异常输出

时间:2012-08-06 19:49:04

标签: java xml transformation xslt

我有一个xml文档和一个样式表,可以将文档转换为另一个有用的xml。 作为参考,xml文档有点像这样:

<root>
 <element1>value1</element1>
 <element2>value2</element2>
 <element3>value3</element3>
 <element4>..some more levels of data</element4>
</root>

样式表看起来有点像这样:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:include href="errorResponse.xsl"/>
<xsl:template match="root/element4">
        <xsl:element name="myRoot">
            <xsl:element name="myElement">
                <xsl:apply-templates select="./someElement/someOtherElement"/>
            </xsl:element>
        </xsl:element>
</xsl:template>

我得到的输出xml字符串是这样的:

<?xml version="1.0" encoding="ISO-8859-1"?>
value1
value2
value3
<myRoot><myelement> some data </myElemrnt></myroot>

我用于转换的代码片段是这样的:

InputStream styleSheet = new FileUtil().getFileStream("xsltFileName");
StreamSource xslStream = new StreamSource(styleSheet);

DOMSource in = new DOMSource(inputXMLDoc);
ByteArrayOutputStream baos = new ByteArrayOutputStream();

TransformerFactory transFact = TransformerFactory.newInstance();
transFact.setURIResolver(new XsltURIResolver());
Transformer trans = transFact.newTransformer(xslStream);
trans.transform(in, new StreamResult(baos));
System.out.println(baos.toString()); // displays the above output

但输出格式不合适。我不想要value1,value2,value3。这也为生成的新XML进行了进一步的处理。

我看到很多关于转型的问题。这让我困扰了很长时间。如果有人能够指出我哪里出错了,那就表示赞赏。

同时指出我是否在整个过程中遵循任何不正确的约定。

谢谢和问候。

2 个答案:

答案 0 :(得分:3)

由于Default Template Rule输出了文本节点,因此输出结果。如果您不想要那些节点,则需要通过匹配它们并将它们替换为空(即空模板)来明确地排除它们。

尝试将此模板添加到样式表中:

<xsl:template match="/">
  <xsl:apply-templates select="root/element4"/>
</xsl:template>

它匹配根并丢弃除root/element4之外的所有内容。

答案 1 :(得分:1)

此处发生的是XSLT built-in templates已应用到未通过模板明确匹配的任何节点。内置模板的净效果是将任何文本节点(应用了tey)复制到输出。

压制此不需要的输出的最简单和最简单的方法之一是添加以下模板:

<xsl:template match="text()"/>

会导致选择执行此模板的任何文本节点,而不是复制到输出。