如何使用和处理重复的XML元素以使用shell脚本创建其他元素?

时间:2013-10-01 14:06:39

标签: xml shell xpath xmlstarlet

假设我想用(POSIX兼容的)shell脚本创建下一个XML文件:

<xml>
    <item>
        <title>The Turning Point to a Cross Fade in a Carpark</title>
        <slug>the-turning-point-to-a-cross-fade-in-a-carpark</slug>
    </item>
    <item>
        <title>The Cycle Continues in One Direction</title>
        <slug>the-cycle-continues-in-one-direction</slug>
    </item>
</xml>

但我只有下一个:

<xml>
    <item>
        <title>The Turning Point to a Cross Fade in a Carpark</title>
    </item>
    <item>
        <title>The Cycle Continues in One Direction</title>
    </item>
</xml>

使用XMLStarlet edit --update(并且仅使用--update)我可以在表单中使用XPath表达式而不是字符串值:

xml ed -u '/xml/item/slug' -x '../title/text()'

但XPath 2.0字符串函数似乎不起作用(xmlXPathCompOpEval: function lower-case not found)。然后我怎么能遍历所有块并使用<title>元素的文本值来生成<slug>元素?如何使用最少xml次操作执行此操作?

2 个答案:

答案 0 :(得分:0)

类似的东西:

translate(../title,'ABCDEFGHIJKLMNOPQRSTUVWXYZ ','abcdefghijklmnopqrstuvwxyz-')

答案 1 :(得分:0)

这是我到目前为止translate()normalize-space()

xml ed -a '/xml/item/title' \
       -t 'elem' \
       -n 'slug' \
       -v '' \
\
       -u '/xml/item/slug' \
       -x 'translate(
               normalize-space(
                   translate(
                       ../title/text(),
                       "AÁBCDEÉFGHIÍJKLMNOÓÖŐPQRSTUÚÜŰVWXYZ-+.,:;!()&#",
                       "aábcdeéfghiíjklmnoóöőpqrstuúüűvwxyz  "
                   )
               ),
               " ",
               "-"
           )'

这背后的想法是

  1. 将文本转换为小写,
  2. 删除所有突出显示的字母和特殊符号,
  3. 将每个短划线和加号转换为空格
  4. 并删除所有不必要的空格。
  5. 制作那个字符集远非最佳,因为我必须指定我要删除的每个字符,而我只知道那些应该保留的字符。如何将打字机撇号放入集合中?!

    我愿意接受更好的创意。