1

假设我想使用(符合 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动作做到这一点?

4

2 回答 2

0

就像是:

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

于 2013-10-01T20:49:12.950 回答
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. 并删除所有不必要的空格。

构成该字符集远非最佳,因为我必须指定要删除的每个字符,而我只知道应该保留的字符。以及如何将打字机撇号放在集合中?!

我愿意接受更好的想法。

于 2013-10-01T20:49:26.420 回答