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

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 バリアントははるかにクリーンで、2 パス変換を必要としませんが、XSLT 1.0 に行き詰まっていて EXSLT を利用できる場合は、これで目的の場所に移動できます。

于 2013-04-10T15:47:26.747 に答える
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 に答える