在保留它们的标记之间将文本转换为大写
Posted
技术标签:
【中文标题】在保留它们的标记之间将文本转换为大写【英文标题】:Convert text to uppercase between tag keeping them 【发布时间】:2021-09-27 20:38:46 【问题描述】:我正在尝试使用 XSLT 将 html 内容转换为大写,但要求是保持标签层次结构不变(即,只需更改文本)。
例如:<p>some text <b>other text</b></p>
应该导致
<p>SOME TEXT <b>OTHER TEXT</b></p>
.
使用以下 XSLT,我设法将文本转换为大写,但结果丢失了标记层次结构。
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output encoding="UTF-8" indent="no" method="xhtml" standalone="0" version="1.0"/>
<xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'"/>
<xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:template match="/">
<xsl:value-of select="translate(/, $smallcase, $uppercase)"/>
</xsl:template>
</xsl:transform>
有什么方法可以保持标签不变?
提前致谢。
【问题讨论】:
【参考方案1】:试试:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'"/>
<xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()">
<xsl:value-of select="translate(., $smallcase, $uppercase)"/>
</xsl:template>
</xsl:stylesheet>
请注意,xhtml
在 XSLT 1.0 中不是有效的输出方法。
【讨论】:
以上是关于在保留它们的标记之间将文本转换为大写的主要内容,如果未能解决你的问题,请参考以下文章