使用 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>
解释:
正确使用
<xsl:analyze-string>
说明。正确使用
\p{L}
字符类。正确使用
<xsl:matching-substring>
和<xsl:non-matching-substring>
说明。
关于xml - 在xsl中的节点和子节点中将文本转换为小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15101862/