【问题标题】:Keeping the indentation of the source document in the result document in XSLT在 XSLT 的结果文档中保留源文档的缩进
【发布时间】:2020-03-27 09:06:33
【问题描述】:

我一直在使用 Oxygen XML 编辑器进行 XSL 转换(XSL v.2 样式表上的 Saxon-HE 9.8.0.8),并且源文档和结果文档的缩进是相同的:这正是我所需要的。

当我从命令行(Saxon-HE 9.8.011J,Java 版本 1.8.0_161)运行 XSLT 时,我没有得到相同的结果(结果文档根本没有缩进)。我能做些什么来改变这一点吗?

<xsl:output indent="yes"/> 也会缩进我不需要的内联元素,<xsl:strip-space elements/> 会删除内联元素之间的一些必要空格)。

来源:

    <chapter id="ch3">
    <title>Sed quam, quaes apiducius nit peror asperch icatiat</title>
            <section id="s1">
            <title>Et faccae sitiaessum res re dolorer errovitam,</title>
            <paragraph id="p6">
                <text>lorerit ab is arum dolore quaepudit exped magnate mpelestinus volupta</text>
            </paragraph>
            <paragraph id="p7">
                <text>lorerit ab is arum <span class="s1">dolore</span> <span class="s2">quaepudit</span> exped magnate mpelestinus volupta</text>
            </paragraph>
            <paragraph id="p12">
                <text>lorerit ab is arum dolore quaepudit exped magnate mpelestinus volupta</text>
            </paragraph>
    </section>
</chapter>

XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"  xmlns:xlink="http://www.w3.org/1999/xlink">
    <xsl:template match="*">
        <xsl:element name="{local-name()}" >
            <xsl:for-each select="@*" >
                <xsl:attribute name="{local-name()}">
                    <xsl:value-of select="."/>
                </xsl:attribute>
            </xsl:for-each>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="paragraph">
        <xsl:element name="paragraph">
            <xsl:attribute name="id">p<xsl:number count="paragraph" from="chapter" level="any"></xsl:number>
            </xsl:attribute>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

命令行代码

java -cp path\saxon9he.jar net.sf.saxon.Transform -t -s:path\source.xml -xsl:path\transformation.xsl -o:path\result.xml

除非源代码位于特定的 DTD 中。当我删除源代码开头提到的DTD时,缩进保持不变,否则没有缩进。这是什么原因,我该如何改变它?

谢谢! 玛丽亚 (我是个初学者)

【问题讨论】:

  • 我使用命令 xmllint --format 重新缩进我的 XML 文件。我尝试使用标签&lt;xsl:text&gt;...&lt;/xsl:text&gt; 分隔文本节点,以避免在我担心空格周围有任何不确定行为时在输出中添加或抑制空格。
  • 您能否向我们展示确切的命令行以及 XML、XSLT 的最小但具有代表性的示例、您想要的输出以及您获得的输出?我不认为默认情况下命令行上的 Saxon 不会去除任何空白,也不会做任何缩进,所以我不确定为什么您会在命令行上看到 oXygen 和 Saxon 之间的差异。
  • 谢谢!我编辑了我的帖子,我认为它与我正在使用的 DTD 有关,但我看不出如何以及为什么......

标签: xml xslt indentation


【解决方案1】:

如果:

(a) 您不会从输入文档中删除空间

(b) 您的样式表将所有文本节点(包括空白文本节点)复制到结果树中

(c) 你不用序列化缩进

那么结果的缩进应该和源一样。

如果这没有发生,那么我们需要查看您正在执行的操作的详细信息。弄错空格的方法有很多,如果不看细节就不可能知道哪里出错了。

(顺便说一句,您可以在xsl:output 上使用suppress-indentation="p" 之类的东西来获得段落级别以上的缩进,但不能在段落内。)

【讨论】:

  • 谢谢!会不会和DTD有关?
  • 是的,可以。规范说:“在 DTD 或 Schema 中定义的包含纯元素内容的元素将剥离空白文本节点,无论样式表中的 xsl:strip-space 和 xsl:preserve-space 声明如何。”跨度>
  • 谢谢。您认为除了删除源文档中提到的 DTD 之外,还有其他方法可以绕过吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 2014-05-01
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
相关资源
最近更新 更多