我有以下xml。
<?xml version="1.0" encoding="UTF-8"?>
<chapter num="A">
<title>
<content-style font-style="bold">PART 1 GENERAL PRINCIPLES</content-style>
</title>
<section level="sect1">
<section level="sect2" number-type="manual" num="1.">
<title>INTRODUCTION OF INDIA TO NEW ERA AND THE EXISTING</title>
</section>
</section>
</chapter>
通过使用下面的xslt,我能够捕捉每个单词。
<xsl:element name="{concat(translate(substring(name(), 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), substring(name(), 2))}">
我得到以下输出。
Introduction Of India To New Era And The Existing
但我想如下。
Introduction of India to New Era and the Existing
即。我想忽略连词。请让我知道我该怎么做。
由于
答案 0 :(得分:1)
此转换使用FXSL库的strSplit-to-Words
模板(用纯XSLT 1.0编写),除了事实上的标准xxx:node-set()
之外不需要任何扩展函数: 强>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext">
<xsl:import href="strSplit-to-Words.xsl"/>
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<xsl:variable name="vLowercase" select="'abcdefghijklmnopqrstuvwxyz'"/>
<xsl:variable name="vUppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:variable name="vConjunctions" select=
"'|AND|THE|OF|A|AN|TO|FOR|AT|ON|IN|INTO|AMONG|FROM|'"/>
<xsl:strip-space elements="*"/>
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<xsl:param name="pDelims" select="' 

'"/>
<xsl:template match="/">
<xsl:variable name="vwordNodes">
<xsl:call-template name="str-split-to-words">
<xsl:with-param name="pStr" select="/"/>
<xsl:with-param name="pDelimiters"
select="$pDelims"/>
</xsl:call-template>
</xsl:variable>
<xsl:apply-templates select=
"ext:node-set($vwordNodes)/*[normalize-space()]"/>
</xsl:template>
<xsl:template match="word">
<xsl:if test="not(position() = 1)"><xsl:text> </xsl:text></xsl:if>
<xsl:choose>
<xsl:when test="contains($vConjunctions, concat('|',.,'|'))">
<xsl:value-of select="translate(substring(., 1, 1), $vUppercase, $vLowercase)"/>
</xsl:when>
<xsl:otherwise><xsl:value-of select="substring(., 1, 1)"/></xsl:otherwise>
</xsl:choose>
<xsl:value-of select="translate(substring(., 2), $vUppercase, $vLowercase)"/>
</xsl:template>
</xsl:stylesheet>
对以下XML文档应用此转换时:
<title>INTRODUCTION OF INDIA TO NEW ERA AND THE EXISTING</title>
产生了想要的正确结果:
Introduction of India to New Era and the Existing
答案 1 :(得分:0)
试试这个:
<?xml version='1.0'?>
<xslt:stylesheet version="2.0" xmlns:xslt="http://www.w3.org/1999/XSL/Transform"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="Conjunction">(of)|(to)|(and)|(the)</xsl:param>
<xsl:template match="chapter/section/section/title">
<xsl:call-template name="changeUpperCase">
<xsl:with-param name="Text" select="text()"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="changeUpperCase">
<xsl:param name="Text"/>
<xsl:value-of select="for $EachToken in tokenize(lower-case($Text), ' ')
return
if(matches($EachToken, $Conjunction))
then
$EachToken
else
concat(upper-case(substring($EachToken, 1, 1)), substring($EachToken, 2))"/>
</xsl:template>
</xslt:stylesheet>
答案 2 :(得分:0)
抄袭@NavinRawat提供的答案,这是一个XSLT 1.0变体。请注意,它需要使用EXSLT Extension Library's
node-set()
函数。
当这个XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
exclude-result-prefixes="exsl"
version="1.0">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pConjunctions" select="'|OF|TO|AND|THE|'"/>
<xsl:variable name="vUppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:variable name="vLowercase" select="'abcdefghijklmnopqrstuvwxyz'"/>
<xsl:template match="/*/*/*/title">
<xsl:variable name="vTitleWords">
<xsl:call-template name="tokenize">
<xsl:with-param name="text" select="."/>
<xsl:with-param name="delimiter" select="' '"/>
</xsl:call-template>
</xsl:variable>
<xsl:apply-templates select="exsl:node-set($vTitleWords)/*"/>
</xsl:template>
<xsl:template match="token">
<xsl:if test="position() > 1"> </xsl:if>
<xsl:choose>
<xsl:when test="contains($pConjunctions, concat('|', ., '|'))">
<xsl:value-of select="translate(., $vUppercase, $vLowercase)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of
select="concat(
substring(., 1, 1),
translate(substring(., 2), $vUppercase, $vLowercase)
)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="text()"/>
<xsl:template name="tokenize">
<xsl:param name="text"/>
<xsl:param name="delimiter" select="' '"/>
<xsl:choose>
<xsl:when test="contains($text,$delimiter)">
<xsl:element name="token">
<xsl:value-of select="substring-before($text,$delimiter)"/>
</xsl:element>
<xsl:call-template name="tokenize">
<xsl:with-param
name="text"
select="substring-after($text,$delimiter)"/>
<xsl:with-param
name="delimiter"
select="$delimiter"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="$text">
<xsl:element name="token">
<xsl:value-of select="$text"/>
</xsl:element>
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
...针对提供的XML运行:
<?xml version="1.0" encoding="UTF-8"?>
<chapter num="A">
<title>
<content-style font-style="bold">PART 1 GENERAL PRINCIPLES</content-style>
</title>
<section level="sect1">
<section level="sect2" number-type="manual" num="1.">
<title>INTRODUCTION OF INDIA TO NEW ERA AND THE EXISTING</title>
</section>
</section>
</chapter>
...生成了想要的结果:
Introduction of India to New Era and the Existing
显然,XSLT 2.0变体更清晰,不需要进行两遍转换,但是如果你坚持使用XSLT 1.0并且可以使用EXSLT,那么这将使你获得你想去的地方。