如何用SVG文件中的值替换XML标记的所有出现

时间:2019-02-07 08:06:18

标签: xslt xmlstarlet

如何使用xslt模板用值替换给定的 XML标记的所有出现?

例如,<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 :(得分:1)

考虑将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>

此模板匹配所有节点并复制它们。但是,在match属性中定义的XPath表达式(即[not(name()='tspan')]部分)排除了任何tspan元素节点及其关联的属性节点的复制-有效地删除它们。 tspan元素的子元素节点和/或文本节点将被复制,因此它们将根据需要保留在输出中。

source.xml

考虑以下示例source.xml文件:

<?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>

注意tspana标签的所有实例均已删除。

答案 1 :(得分:0)

此代码段将执行您想要的操作:

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

它找到tspan元素,并丢弃其所有内容。 xsl:value-of select="text()"语句仅将文本节点的内容复制到输出。