【发布时间】:2017-12-17 19:45:24
【问题描述】:
我正在尝试用“-”翻译空白。
数据来自TEI-XML数据:
<m type="base">
<m type="baseForm">A<c type="infix">B</c>CD</m>
</m>
和XSL 文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:for-each select="descendant::m[@type='base']/m[@type='baseForm']">
<xsl:choose>
<xsl:when test="current()/c"><xsl:value-of select="current()[not != c[@type['infix']]] |node()"/></xsl:when>
<xsl:otherwise><xsl:value-of select="current()"/></xsl:otherwise>
</xsl:choose>
<!-- my attempt -->
<xsl:value-of select="translate(., ' ','-')"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
在这篇帖子XSL replace space with caret的回答之后,我使用了translate,但它不起作用。
结果应该是:“A-B-CD”,但我有“A B CD”。
感谢您的热心帮助。
【问题讨论】:
-
translate允许您将一个字符替换为另一个字符,但坦率地说,在示例<m type="baseForm">A<c type="infix">B</c>CD</m>中我根本看不到任何空格,所以您想用translate(., ' ','-')实现什么?第二个参数是空格? -
是的,我知道
TEI-XML中没有空格,但不幸的是,输出带有空格。我不知道为什么... -
您使用
,其中 current() 是一个包含多个文本节点的“m”节点。默认情况下,xsl:value-of 使用空格作为分隔符(参见此处:w3.org/TR/xslt/#constructing-simple-content)。 -
更一般的评论:我建议您将样式表组织为多个模板。为 c[@type='infix'] 定义一个特定模板,为您提供 -B- (在您的示例中)。让 xsl:apply-templates 发挥作用。
-
@Vanessa 问题是你在循环中使用
,但不是整个输出 - 你需要将逻辑放入变量中,然后使用此变量执行翻译功能。请看我的回答。