在保留它们的标记之间将文本转换为大写

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 中不是有效的输出方法。

【讨论】:

以上是关于在保留它们的标记之间将文本转换为大写的主要内容,如果未能解决你的问题,请参考以下文章

JS数字小写转换大写

将所有大写字母转换为初始大写字母

如何使用 CSS 将大写文本转换为标题大小写

使用Java将String中的大写文本转换为带重音的小写

键入时将文本转换为大写

CSS---文本相关属性