【问题标题】:Which one of the following options would be correct when <xsl:strip-space> is implemented?实施 <xsl:strip-space> 时,下列哪一项是正确的?
【发布时间】:2021-05-26 03:08:35
【问题描述】:

所以我是 XML 的初学者,最近收到了 XSLT 的快速介绍。我的老师刚刚给了我这个问题:

给定这个 XML 代码,如果 xsl:strip-space 在 链接到 XML 的 XSL?

<foo>
 <bar>   </bar>
</foo>

然后他给了这三个选择:

<foo><bar/></foo>

<foo>
  <bar/>
</foo>

<foo><bar></bar></foo>

我非常倾向于第 3 个选项,但我仍然犹豫不决,因为其他选项对我来说似乎也是正确的。在这种情况下,数字 3 是唯一正确的选择还是还有更多?

【问题讨论】:

  • FIY,第一个和最后一个选项在语义上是相同的,它们之间的选择与xsl:strip-space无关。而且由于我们不知道您的样式表是否设置为缩进其输出(更不用说它可能包含的任何其他指令),我们无法预测结果。

标签: xml xslt


【解决方案1】:

首先,这取决于xsl:strip-space 实际所说的内容。如果它显示&lt;xsl:strip-space elements="*"/&gt;,则输入等效于&lt;foo&gt;&lt;bar/&gt;&lt;/foo&gt;,而后者又等效于&lt;foo&gt;&lt;bar&gt;&lt;/bar&gt;&lt;/foo&gt;

如果它说&lt;xsl:strip-space elements="foo"/&gt;&lt;xsl:strip-space elements="bar"/&gt;,那么空间剥离将更具选择性。

此外,这假设在样式表的其他地方没有竞争的 &lt;xsl:preserve-space&gt; 声明。

在某些情况下,即使您说&lt;xsl:strip-space elements="*"/&gt;,也不会删除空格。例如:如果在作用域中有 xml:space="preserve" 属性,或者如果存在将元素 bar 定义为 xs:string 类型的架构。

【讨论】:

    【解决方案2】:

    以下是使用三个不同样式表转换输入的三个结果 - 所有样式表都包含相同的模板和说明:

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

    XSLT #1

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="no" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:template match="/">
        <xsl:copy-of select="."/>
    </xsl:template>
    
    </xsl:stylesheet>
    

    结果 #1

    <foo><bar/></foo>
    

    XSLT #2

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:template match="/">
        <xsl:copy-of select="."/>
    </xsl:template>
    
    </xsl:stylesheet>
    

    结果 #2

    <foo>
       <bar/>
    </foo>
    

    XSLT #3

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" indent="no"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:template match="/">
        <xsl:copy-of select="."/>
    </xsl:template>
    
    </xsl:stylesheet>
    

    结果 #3

    <foo><bar></bar></foo>
    

    这些结果是使用 Saxon 6.5.5 生成的。不同的处理器可能会产生不同的结果。


    -- 补充说明--

    我应该补充一点,我上面的回答与转换的预期输出有关。但是,xsl:strip-space 指令是在 输入 上实现到转换的 - 任何其他处理发生之前。重要的是要记住,转换的输入是 - 不是树的词法表示。

    IOW,如果原始输入树是:

    然后申请后:

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

    输入树将是:

    这个输入树可以同样很好地表示为:

    <foo><bar/></foo>
    

    或通过:

    <foo><bar></bar></foo>
    

    【讨论】:

    • 我不确定这是否能回答问题。在所有三个示例中,空格都从输入中去除;但是第二个示例由于 indent="yes" 将新的空格放入输出中。您的演示也让我感到困惑,因为 (1,2,3) 旨在对示例进行编号,而不是识别 XSLT 的版本。
    • @MichaelKay 我的目的不是回答这个问题,而是表明如果没有其他信息就无法回答这个问题。我已经编辑了标题以使它们(希望)不那么混乱。
    猜你喜欢
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多