使用:
concat(translate(substring(.,1,1), '_', ' '),
translate(substring(.,2), '_', '.')
)
这是一个完整的转换:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"td[preceding-sibling::*[1][self::td and . = 'Frame Rate']]/text()">
<xsl:value-of select=
"concat(translate(substring(.,1,1), '_', ' '),
translate(substring(.,2), '_', '.')
)
"/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于一个简单的 XML 文档时,该文档包含tr
来自实际 XML 文档的一个实际元素(并添加一个以测试第二种情况),如提供的链接所指:
<t>
<tr>
<td class="title_column">Frame Rate</td>
<td>_23_976</td>
</tr>
<tr>
<td class="title_column">Frame Rate</td>
<td>118_235</td>
</tr>
</t>
产生了想要的正确结果:
<t>
<tr>
<td class="title_column">Frame Rate</td>
<td> 23.976</td>
</tr>
<tr>
<td class="title_column">Frame Rate</td>
<td>118.235</td>
</tr>
</t>
说明:
表达方式:
concat(translate(substring(.,1,1), '_', ' '),
translate(substring(.,2), '_', '.')
)
通过以下方式进行评估:
函数的两个参数concat()
分别计算(彼此独立)。
concat()
就像它的名字所暗示的那样——将它的两个字符串参数连接成一个字符串。
该translate()
函数在此表达式中被引用了两次——它用于生成 `concat() 的每个参数。
的第一个调用translate()
是:translate(substring(.,1,1), '_', ' ')
。在这种情况下,传递给函数的第一个参数是当前节点的字符串值的前导字符(在 XPath 中,当前(或上下文)节点由 表示.
)。这个前导字符是由函数调用产生的:substring(.,1,1)
它接受一个从偏移量 1 开始并且长度为 1的子字符串translate()
。这个调用的第二个参数是一个包含我们想要替换或删除的所有字符的字符串——在这种情况下只是单个"_"
字符。第三个参数translate()
是一串“替换字符”,应该替换第二个参数中对应的(按位置)字符。在这种情况下,第三个参数包含单个字符' '
(nbsp),这意味着对translate()
函数的调用会将当前节点的字符串值的第一个字符替换为nbsp ,如果它恰好是一个下划线。
第二个调用translate()
类似于第一个调用:translate(substring(.,2), '_', '.')
. 但是,它将应用于当前节点的字符串值的剩余部分(从位置 2 开始),并用点字符替换该剩余部分中的任何下划线。
更新:
由于 OP 难以理解如何将此解决方案调整为他自己的代码。这是我的猜测(因为他的源 XML 文档不是所提供的链接所指向的文档,我无法猜测真正的 XML 文档是什么):
<tr>
<xsl:for-each select="Settings/Groups/Recording">
<tr>
<td class="title_column">Frame Rate</td>
<td>
<xsl:value-of select=
"concat(translate(substring(RecOutLinkSpeed,1,1), '_', ' '),
translate(substring(RecOutLinkSpeed,2), '_', '.')
)
"/>
</td>
</tr>
</xsl:for-each>
</tr>