選択的に属性を追加する: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>"