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

Xml 为什么运行xslt会得到不同的输出?,xml,xslt,saxon,xmlspy,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> <

我正在为源节点执行一个非常简单的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的方法?

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

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


这应该在样式表的顶层(作为root
xsl:stylesheet
元素的子元素)。

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

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


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

这些差异是由于

XML文档中的空白

默认情况下,Altova XSLT 2.0引擎会去除所有边界空白 从源XML文档中的仅限边界空白节点。这个 删除此空白会影响
fn:position()
中的值,
fn:last()
fn:count()
,和
fn:deep-equal()
函数返回。更多 详细信息,请参见XPath 2.0中的 和XQuery 1.0功能部分

AltovaXML在具有纯空白内容的元素之间剥离“边界空白”文本节点:

边界纯空白文本节点是纯空白文本的子节点 发生在混合元素中两个元素之间的节点 内容

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

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


但是,您无法让AltovaXML保留空格,而总是将其删除。

这些差异是由于

XML文档中的空白

默认情况下,Altova XSLT 2.0引擎会去除所有边界空白 从源XML文档中的仅限边界空白节点。这个 删除此空白会影响
fn:position()
中的值,
fn:last()
fn:count()
,和
fn:deep-equal()
函数返回。更多 详细信息,请参见XPath 2.0中的 和XQuery 1.0功能部分

AltovaXML在具有纯空白内容的元素之间剥离“边界空白”文本节点:

边界纯空白文本节点是纯空白文本的子节点 发生在混合元素中两个元素之间的节点 内容

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

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


但是,您无法让AltovaXML保留空格,而总是将其删除。

更准确地说,不是“其他空格”,而是任何仅限空白的文本节点。@谢谢,您知道为什么它在XMLSpy中显示正确吗?@DimitreNovatchev-确实如此。更新。更准确地说,不是“其他空格”,而是任何纯空白文本节点。@谢谢,您知道为什么它在XMLSpy中显示正确吗?@DimitreNovatchev-确实如此。更新。感谢此提示-遇到相同问题。感谢此提示-遇到相同问题。