【问题标题】:Why do I get different output running xslt?为什么我在运行 xslt 时会得到不同的输出?
【发布时间】:2011-12-29 21:04:43
【问题描述】:

我正在为源节点做一个非常简单的 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>

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

【问题讨论】:

    标签: xml xslt saxon xmlspy


    【解决方案1】:

    差异是由于the manner in which the Altova XML processor handles whitespace in mixed content.

    XML 文档中的空格

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

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

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

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

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

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

    【讨论】:

    • 感谢您的提示 - 遇到了同样的问题。
    【解决方案2】:

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

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

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

    【讨论】:

    • 更准确地说,不是“其他空格”,而是任何纯空白文本节点。
    • @thank you,你知道为什么它在 XMLSpy 中正确显示吗?
    • @DimitreNovaatchev - 确实如此。已更新。
    猜你喜欢
    • 2013-02-28
    • 2021-06-14
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-08
    • 2022-06-15
    • 2018-02-03
    相关资源
    最近更新 更多