Как заменить все вхождения тега XML на его значение в файле SVG - PullRequest
0 голосов
/ 07 февраля 2019

Как я могу заменить все вхождения данного XML-тега его значением, используя шаблон xslt?

Например, <tspan x="12.02" y="0">ogen</tspan> станет ogen.

Я могу удалить все вхождения, используя эту командную строку:

xmlstarlet ed -N ns=http://www.w3.org/2000/svg -d "//ns:tspan" foo.svg

Но я все еще не могу найти способ заменить его на его значение.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Рассмотрите возможность использования таблицы стилей XSL с шаблоном, содержащим необходимые правила.Например:

strip-tag.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
  <xsl:template match="node()[not(name()='tspan')]|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

Этот шаблон сопоставляет все узлы и копирует их.Однако выражение XPath , определенное в атрибуте match (то есть в части [not(name()='tspan')]), исключает копирование любых узлов элемента tspan и связанных с ними узлов атрибута, что эффективно удаляет их.Узлы дочерних элементов и / или текстовые узлы элемента tspan будут скопированы, поэтому они будут оставаться в выходных данных по желанию.

source.xml

Рассмотрим следующий пример source.xml file:

<?xml version="1.0"?>
<svg width="250" height="40" viewBox="0 0 250 40" xmlns="http://www.w3.org/2000/svg" version="1.1">
  <text x="10" y="10">The <tspan x="10" y="10">quick</tspan> brown fox <tspan x="30" y="30">jumps</tspan> over the lazy dog</text> 
  <a href="https://www.example.com"><text x="100" y="100"><tspan x="50" y="50">click</tspan> me</text></a> 
</svg>

Преобразование источника xml

  • Выполнение следующей команды xmlstarlet (с указанием правильных путей для файлов) :

    $ xml tr path/to/strip-tag.xsl path/to/source.xml
    
  • Или с помощью следующей команды xsltproc (если она доступна в вашей системе):

    $ xsltproc path/to/strip-tag.xsl path/to/source.xml
    

будетвыведите на консоль следующее:

<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" width="250" height="40" viewBox="0 0 250 40" version="1.1">
  <text x="10" y="10">The quick brown fox jumps over the lazy dog</text>
  <a href="https://www.example.com"><text x="100" y="100">click me</text></a>
</svg>

Примечание: Все экземпляры открывающих и закрывающих тегов tspan удалены.

Удаление нескольких

Чтобы удалить несколько различных именованных элементов, используйте оператор and в выражении XPath, определенном в атрибуте match.Например:

<!-- strip-multiple-tags.xsl-->

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
  <xsl:template match="node()[not(name()='tspan') and not(name()='a')]|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

Преобразование source.xml с использованием этого шаблона приведет к следующему выводу:

<svg xmlns="http://www.w3.org/2000/svg" width="250" height="40" viewBox="0 0 250 40" version="1.1">
  <text x="10" y="10">The quick brown fox jumps over the lazy dog</text>
  <text x="100" y="100">click me</text>
</svg>

Примечание: Всеэкземпляры тегов tspan и a удалены.

0 голосов
/ 07 февраля 2019

Этот фрагмент будет делать то, что вы хотите:

<xsl:template match="tspan">
    <xsl:value-of select="text()"/>
</xsl:template>

Он находит элементы tspan и удаляет все их содержимое.Оператор xsl:value-of select="text()" копирует содержимое текстового узла только в выходные данные.

...