[编辑:更改标题以更好地概念化问题。]
属性的值@xml:space
可以是"default"
或"preserve"
。XML 指定第二个含义,但将第一个留给应用程序。(我想我是对的。)那么如果应用程序想要default
实现 XSchema 的collapse
呢?XSLT 1.0 如何真正做到这一点?
我认为处理文本的内置模板,即
<xsl:template match="text()">
<xsl:value-of select="."/>
</xsl:template>
需要用类似这样的伪代码替换:
<xsl:choose>
<xsl:when test="../@xml:space='preserve'"
<xsl:value-of select="."/>
</xsl:when>
<xsl:otherwise>
if position(.)=1 then output LTRIM(value-of(.))
if position(.)=last() then output RTRIM(value-of(.))
if position(.)= 1 and last()=1 then output normalize-space(.)
</xsl:otherwise>
</xsl:choose>
然后这个输入:
<persName> The man is
<forename>Edward</forename>
<forename>George</forename>
<surname type="linked">Bulwer-Lytton</surname>, <roleName>Baron Lytton of
<placeName>Knebworth</placeName>
</roleName>
</persName>
将被正确渲染,就像修剪The man is Edward George Bulwer-Lytton, Baron Lytton of Knebworth
前后的空间The man
以及折叠和折叠之间的空间一样。(示例来自 TEI。)Knebworth
Edward
George
[编辑:我在这里删除了一个不正确且具有误导性的段落。]
需要为每个文本节点执行用于实现该伪代码的 XSLT 1.0。那岂不是又丑又慢?[编辑:也许不是。我简化了伪代码。有快速修剪程序吗?选择真的那么慢吗?】
底线:如何在 XSLT 1.0 中实现 XSchema 的折叠(只有浏览器嵌入的扩展)?
我希望我说的都是正确的。我希望代码很简单。我还没有看到它是怎么回事。[编辑:将 xs:collapse 更改为 XSchema 的崩溃。]