Объединить значение тега xml в командной строке - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь объединить издателя и значение isbn в тег заголовка с помощью sed. Но я не могу найти здесь ни одного примера, который бы соответствовал моим требованиям. Пример как ниже

от этого

<book>
  <title>The Big Book of Silly Jokes for Kids</title>
  <publisher>Rockridge Press</publisher>
  <isbn>ISBN-10</isbn>
</book>

к этому

<book>
  <title>[Rockridge Press ISBN-10] The Big Book of Silly Jokes for Kids</title>
  <publisher>Rockridge Press</publisher>
  <isbn>ISBN-10</isbn>
</book>

Ответы [ 2 ]

2 голосов
/ 12 апреля 2020

С xmlstarlet:

xml ed -u /book/title -x "concat('[',/book/publisher/text(),' ',/book/isbn,'] ',/book/title)" book.xml

вывод:

<?xml version="1.0"?>
<book>
  <title>[Rockridge Press ISBN-10] The Big Book of Silly Jokes for Kids</title>
  <publisher>Rockridge Press</publisher>
  <isbn>ISBN-10</isbn>
</book>

РЕДАКТИРОВАТЬ: пробел добавляется после ']' --inplace 'необязательно для' edit file inplace '.

1 голос
/ 12 апреля 2020

Командная строка для изменения узлов в файле XML может быть, как вы говорите, xmlstarlet.

Вы также можете написать программу XSL следующим образом:

book.xsl

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" encoding="utf-8"/>

  <xsl:template match="title"><!-- the node you want to modify -->
    <title>
      <xsl:text>[</xsl:text>
      <xsl:value-of select="../publisher/text()"/>
      <xsl:text> </xsl:text>
      <xsl:value-of select="../isbn/text()"/>
      <xsl:text>] </xsl:text>
      <xsl:value-of select="../title/text()"/>
    </title>
  </xsl:template>

  <xsl:template match="@*|node()"><!-- identity transformation for remaining nodes -->
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

Предполагая, что ваш исходный файл называется book.xml вышеуказанная программа XSL может быть запущена из командной строки:

xsltproc book.xsl book.xml
...