3

Dublin Core (XML) 目録レコードを処理し、各書籍の引用の Chicago、APA、および MLA バージョンを作成する XSLT スタイルシートを作成しようとしています。APA の作成者以外はすべてうまくいきました。著者のための APA のスタイルでは、著者の姓 (完了)、コンマ、最初のイニシャル (完了)、その他のイニシャル (私の行き詰まりの問題) が必要です。

私が今持っているもの(およびサンプルDC要素は以下です):

<xsl:value-of select="substring-before(dc:creator[1],',')" /><xsl:text>, </xsl:text><xsl:value-of select="substring(substring-after(dc:creator[1],' '),1,1)" /><xsl:for-each select="dc:creator[position()!=1]"><xsl:choose><xsl:when test="position()=last()"><xsl:text>., &amp; </xsl:text></xsl:when><xsl:otherwise>., </xsl:otherwise></xsl:choose><xsl:value-of select="substring-before(.,',')" /><xsl:text>, </xsl:text><xsl:value-of select="substring(substring-after(.,' '),1,1)" /><xsl:if test="position()=last()">.</xsl:if></xsl:for-each>

次の形式のインスタンスの場合 (カタログが使用するもの):

<dc:creator>Friend, Natasha</dc:creator>

これは問題なく機能し、次のように返されます。Friend, N.

しかし、

<dc:creator>Tolkien, J. R. R.</dc:creator>

戻ります:Tolkien, J.

多くの場合、それは問題ではありませんが、J.R.R. Tolkienまたはのように、著者のミドルネームのイニシャルを返す必要がある場合がありますJ.K. Rowling

そのため、スペースの最初のインスタンスだけでなく、各スペースの後にある文字を返すことができる必要があります。

何か案は?

4

1 に答える 1

3

I. 以下は、簡単で自然な XSLT 2.0 ソリューションです。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*/*">
  <xsl:value-of separator=", " select=
  "substring-before(., ',')
   , for $n in tokenize(substring-after(., ','), '\s')[.]
        return
          substring($n, 1,1)
  "/>
  <xsl:text>&#xA;</xsl:text>
 </xsl:template>
</xsl:stylesheet>

この変換が次の XML ドキュメントに適用される場合:

<t xmlns:dc="some:dc">
 <dc:creator >Friend, Natasha</dc:creator>

 <dc:creator>Tolkien, J. R. R.</dc:creator>
</t>

必要な正しい結果が生成されます。

Friend, N
Tolkien, J., R., R.

Ⅱ.XSLT 1.0 ソリューション:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*/*/text()">
   <xsl:value-of select="substring-before(., ',')"/>

   <xsl:call-template name="replaceTokenDelims">
    <xsl:with-param name="pStr" select=
    "concat(normalize-space(substring-after(., ',')), ' ')"/>
    <xsl:with-param name="pToken" select="' '"/>
    <xsl:with-param name="pReplacement" select="', '"/>
   </xsl:call-template>
   <xsl:text>&#xA;</xsl:text>
 </xsl:template>

 <xsl:template name="replaceTokenDelims">
    <xsl:param name="pStr"/>
    <xsl:param name="pToken"/>
    <xsl:param name="pReplacement"/>

    <xsl:if test="$pStr">
     <xsl:value-of select="$pReplacement"/>
     <xsl:value-of select=
      "substring(substring-before($pStr, $pToken), 1, 1)"/>

     <xsl:call-template name="replaceTokenDelims">
      <xsl:with-param name="pStr"
           select="substring-after($pStr, $pToken)"/>
      <xsl:with-param name="pToken" select="$pToken"/>
      <xsl:with-param name="pReplacement" select="$pReplacement"/>
     </xsl:call-template>
    </xsl:if>
 </xsl:template>
</xsl:stylesheet>

この変換を同じ XML ドキュメント (上記) に適用すると、同じ正しい結果が生成されます。

Friend, N
Tolkien, J., R., R.
于 2012-12-02T03:06:18.053 に答える