为什么我得到运行xslt的不同输出?

时间:2011-12-29 21:04:43

标签: xml xslt saxon xmlspy

我正在为源节点做一个非常简单的xslt,如:

  <p>
        <media type="photo" id="lr002662" rights="licensed">
            <title>Logging in Canada</title>
        </media>Logging is cutting down trees for <definition>
            <word-term>lumber</word-term>
            <word-definition>wood</word-definition>
        </definition>. Loggers are also called <i>lumberjacks.</i>
    </p>

我在xslt样式表上运行此源节点,一次在xmlspy中,我得到以下输出:

 <para>
        <media type="photo" source="lr002662" rights="licensed">
            <resource.title>Logging in Canada</resource.title>
        </media>Logging is cutting down trees for <italic>lumber</italic> (wood). Loggers are also called <italic>lumberjacks.</italic>
    </para>

但是我使用相同的xslt样式表在saxon9he.jar文件的命令行中运行它,我得到了以下内容:

      <para>
        <media type="photo" source="lr002662" rights="licensed">
            <resource.title>Logging in Canada</resource.title>
        </media>Logging is cutting down trees for 
            <italic>lumber</italic>
             (wood)
        . Loggers are also called <italic>lumberjacks.</italic>
    </para>

正如您所看到的,媒体标记之后的文本现在包含了很多回车符,这不是我想要的。我一直在使用XMLSpy,所以从来没有注意到这个问题。任何专家都可以建议一种调试或提供我的xslt的方法吗?

2 个答案:

答案 0 :(得分:3)

差异归因于the manner in which the Altova XML processor handles whitespace in mixed content.

  

XML文档中的空白

     

默认情况下,Altova XSLT 2.0引擎会删除所有边界空白   来自源XML文档中仅限于border-whitespace的节点。该   删除此空格会影响fn:position()的值,   fn:last()fn:count()fn:deep-equal()函数返回。更多   详细信息,请参阅XPath 2.0中的Whitespace-only Nodes in XML Document   和XQuery 1.0 Functions部分。

AltovaXML剥离仅具有空白内容的元素之间的“boundary-whitespace”文本节点:

  

仅限边界空白的文本节点是仅限子空白的文本   在混合元素中的两个元素之间出现的节点   内容。

正如lwburk在他的回答中所建议的,你可以通过在样式表中添加以下内容来指示其他处理器执行相同操作:

<xsl:strip-space elements="*"/>

但是,你不能让AltovaXML保留空格because they have not implemented xsl:preserve-space or xsl:strip-space并且总是将它们剥离出去。

答案 1 :(得分:1)

源代码中存在换行符,因此我希望它们出现在转换的输出中,除非它们被特别删除。您可以使用以下方法删除所有仅限空格的文本节点:

<xsl:strip-space elements="*"/>

这应该位于样式表的顶层(作为根xsl:stylesheet元素的子级)。