0

我有下面的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

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

谢谢

4

3 回答 3

1

此转换使用strSplit-to-WordsFXSL 库的模板(用纯 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
于 2013-04-11T03:52:32.727 回答
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>
于 2013-04-10T10:51:07.130 回答
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,这将让您到达您想去的地方。

于 2013-04-10T15:47:26.747 回答