1

我有一个 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 进一步处理带来了问题。

我已经看到很多关于转换的问题。这困扰了我很长时间。如果有人能指出我哪里出错了,将不胜感激。

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

谢谢并恭祝安康。

4

2 回答 2

3

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

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

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

它匹配根并丢弃除root/element4.

于 2012-08-06T20:06:57.730 回答
1

这里发生的情况是 XSLT内置模板被应用到任何没有被模板显式匹配的节点。内置模板的最终效果是将任何文本节点(应用了 tey)复制到输出。

抑制这种不需要的输出的最简单和最短的方法之一是添加以下模板:

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

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

于 2012-08-07T04:36:38.417 回答