これは DocBook ではなく、DSSSL StyleSheet の問題です。 DSSSL StyleSheet では、必ず <firstname>, <surname> の順にレンダリングするようになっています。
解決するには、DSSSL StyleSheet を処理を書き換える必要があります。 書き換えが必要なのは、dbbibl.dsl にある author-string という定義です。 以下に書き換えた例を示します。
Figure 1. 日本語対応版 author-string
;; The following is obtained from: ;; ;; > $Id: dbbibl.dsl,v 1.23 2000/07/19 18:40:06 nwalsh Exp $ ;; > ;; > This file is part of the Modular DocBook Stylesheet distribution. ;; ;; and modified for Japanese name order convention. (define (author-string #!optional (author (current-node))) ;; Return a formatted string representation of the contents of: ;; AUTHOR: ;; Handles Honorific, FirstName, SurName, and Lineage. ;; If %author-othername-in-middle% is #t, also OtherName ;; Handles *only* the first of each. ;; Format is "Honorific. FirstName [OtherName] SurName, Lineage" ;; CORPAUTHOR: ;; returns (data corpauthor) (let* ((lang (attribute-string "role" (select-elements author (normalize "author")))) (h_nl (select-elements (descendants author) (normalize "honorific"))) (f_nl (if (equal? lang "family-given") (select-elements (descendants author) (normalize "surname")) (select-elements (descendants author) (normalize "firstname")))) (o_nl (select-elements (descendants author) (normalize "othername"))) (s_nl (if (equal? lang "family-given") (select-elements (descendants author) (normalize "firstname")) (select-elements (descendants author) (normalize "surname")))) (l_nl (select-elements (descendants author) (normalize "lineage"))) (has_h (not (node-list-empty? h_nl))) (has_f (not (node-list-empty? f_nl))) (has_o (and %author-othername-in-middle% (not (node-list-empty? o_nl)))) (has_s (not (node-list-empty? s_nl))) (has_l (not (node-list-empty? l_nl)))) (if (or (equal? (gi author) (normalize "author")) (equal? (gi author) (normalize "editor")) (equal? (gi author) (normalize "othercredit"))) (string-append (if has_h (string-append (data-of (node-list-first h_nl)) %honorific-punctuation%) "") (if has_f (string-append (if has_h " " "") (data-of (node-list-first f_nl))) "") (if has_o (string-append (if (or has_h has_f) " " "") (data-of (node-list-first o_nl))) "") (if has_s (string-append (if (or has_h has_f has_o) " " "") (data-of (node-list-first s_nl))) "") (if has_l (string-append ", " (data-of (node-list-first l_nl))) "")) (data-of author)))) |
この例を、自分の DSSSL StyleSheet に追加して、 <author> に role 属性を追加してください。
<author role="family-given"> <surname>佐藤</surname> <firstname>広生</firstname> </author> |
これで、きちんと出力されます。 role 属性が指定されていなければ、従来どおりの処理になります。 また、<surname> と <firstname> の現われる順番には依存しません。
![]() |
以前は lang 属性による切り替えを紹介していましたが、 role を使う方法が望ましいです。 直接 dbbibl.dsl を書き換えるのは、あまりおすすめしません。 |