xslt大写每个单词忽略连词

时间:2013-04-10 09:33:05

标签: xslt

我有以下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

即。我想忽略连词。请让我知道我该怎么做。

由于

3 个答案:

答案 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="' &#xA;&#xD;'"/>

    <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() &gt; 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,那么这将使你获得你想去的地方。