xml - 在xsl中的节点和子节点中将文本转换为小写

标签 xml xslt xslt-2.0 children lowercase

使用 xsl 2.0 我试图将所有大写文本转换为每个节点大写中只有文本的第一个字母。它们是大量可能的子元素。

<text> text text text
<head>BLAH <unkownTag>BLAH</unkownTag> BLAH </head>
</text>

我想将其转换为阅读

<text> text text text
<head>Blah <unkownTag>Blah</unkownTag> Blah </head>
</text>

我最接近的是

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="head/text()">
    <xsl:value-of select="concat(upper-case(substring(.,1,1)),lower-case(substring(.,2)))"/>        
</xsl:template> 

这给了我结果

<text> text text text 
   <head>Blah <unkownTag>BLAH</unkownTag> blah </head>
</text>

如何让 head 的所有子节点发生小写转换?

最佳答案

无论分隔单词的标点符号如何,此转换都会产生所需的结果:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="head//text()">
  <xsl:analyze-string select="." regex="\p{{L}}+">
   <xsl:matching-substring>
     <xsl:value-of select=
      "concat(upper-case(substring(.,1,1)), lower-case(substring(.,2)))"/>
   </xsl:matching-substring>
   <xsl:non-matching-substring>
    <xsl:value-of select="."/>
   </xsl:non-matching-substring>
  </xsl:analyze-string>
 </xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<text> text text text
 <head>BLAH <unkownTag>BLAH</unkownTag> BLAH </head>
</text>

产生了想要的、正确的结果:

<text> text text text
 <head>Blah <unkownTag>Blah</unkownTag> Blah </head>
</text>

应用于此 XML 文档时:

<text> text text text
 <head>BLAH$<unkownTag>BLAH</unkownTag>-BLAH;</head>
</text>

再次产生正确的结果:

<text> text text text
 <head>Blah$<unkownTag>Blah</unkownTag>-Blah;</head>
</text>

解释:

  1. 正确使用 <xsl:analyze-string> 说明。

  2. 正确使用 \p{L} 字符类。

  3. 正确使用 <xsl:matching-substring> <xsl:non-matching-substring> 说明。

关于xml - 在xsl中的节点和子节点中将文本转换为小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15101862/

相关文章:

xml - XSL FO - 每个元素页脚中的页码不同

c# - 有没有办法像 DataTable 那样管理对不规则 XML 文档的更改?

xml - 缺少节点的 xpath

xml - 使用 XSLT 转换其中包含 < > 的 XML

xml - xsl : how to split strings?

java - 寻找在 Java/Maven 中应用 XML 补丁的工具

xml - 检查节点集是否包含 XSLT 中的任何值

Javascript XSLT 框架

xslt - 如何测试参数是否已传递到 XSLT v 2.0 中的模板?

xslt - XPath - 选择仅包含空格的节点