選択的に属性を追加する:cxml stp - lisp-cookbook-ja/common-lisp GitHub Wiki
このページでは、CLiki:plexippus-xpathを組み合せる例を紹介しています
ライブラリの導入方法
(ql:quickload :xpath)
XML文章構築
(defparameter *doc*
(cxml:parse
"
<a>
<b name='トド松'>6</b>
<b name='チョロ松'>3</b>
<b name='一松'>4</b>
<b name='カラ松'>2</b>
<b name='十四松'>5</b>
<b name='おそ松'>1</b>
</a>
"
(stp:make-builder)))
下記の例では、属性nameが「おそ松」の時のみ、「長男」という値を持つ属性aliasを追加しています。
(let* ((doc (stp:copy *doc*)) ;破壊的に変更するのでコピー
(cs (xpath:all-nodes (xpath:evaluate "/a/b" doc))))
(dolist (c cs)
(when (string= "おそ松" (stp:attribute-value c "name"))
(stp:add-attribute c (stp:make-attribute "長男" "alias"))))
(stp:serialize doc (cxml:make-string-sink))) ; XML文字列へ
;=> "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
; <a>
; <b name=\"トド松\">6</b>
; <b name=\"チョロ松\">3</b>
; <b name=\"一松\">4</b>
; <b name=\"カラ松\">2</b>
; <b name=\"十四松\">5</b>
; <b alias=\"長男\" name=\"おそ松\">1</b>
; </a>"