如何使用 XSLT 将 XML 子树从多个文件复制到一个文件中



多个文件

我得到了一系列遵循以下结构的文档(generated-*.svg):

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
  <defs>
    <font id="Hanzi-Pinyin-ruby-font" horiz-adv-x="254">
      <font-face font-family="Droid Sans Fallback" units-per-em="256" panose-1="2 11 5 2 0 0 0 0 0 1" ascent="267" descent="-68" alphabetic="0"/>
      <missing-glyph horiz-adv-x="256" d="M75 183H181V0H75V183ZM88 13H167V170H88V13Z"/>
      <glyph unicode="&#xF900;" glyph-name="豈" horiz-adv-x="256" d=""/>
    </font>
  </defs>
</svg>

任务

对于每个generated-*.svg

  1. 我想得到/svg/defs/font/glyph的结果序列;
  2. 将序列附加到同一位置/xpath 中的现有文件并保留现有节点。

因此,从生成的文件移动到通用文件。

问题

如何从每个generated-*.svg复制生成的/svg/defs/font/glyph序列,并将其插入到同一 xpath 中的目标文件中?结果输出如下:

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
  <defs>
    <font id="Hanzi-Pinyin-ruby-font" horiz-adv-x="254">
      <font-face font-family="Droid Sans Fallback" units-per-em="256" panose-1="2 11 5 2 0 0 0 0 0 1" ascent="267" descent="-68" alphabetic="0"/>
      <missing-glyph horiz-adv-x="256" d="M75 183H181V0H75V183ZM88 13H167V170H88V13Z"/>
      <glyph unicode="&#xF900;" glyph-name="豈" horiz-adv-x="256" d=""/>
      <glyph unicode="&#xF901;" glyph-name="更" horiz-adv-x="256" d=""/><!-- from: generated-01.svg -->
      <glyph unicode="&#xF902;" glyph-name="車" horiz-adv-x="256" d=""/><!-- from: generated-01.svg -->
      <glyph unicode="&#xF903;" glyph-name="賈" horiz-adv-x="256" d=""/><!-- from: generated-02.svg -->
      <glyph unicode="&#xF904;" glyph-name="滑" horiz-adv-x="256" d=""/><!-- from: generated-02.svg -->
      <glyph unicode="&#xF905;" glyph-name="串" horiz-adv-x="256" d=""/><!-- from: generated-02.svg -->
      <glyph unicode="&#xF906;" glyph-name="句" horiz-adv-x="256" d=""/><!-- from: generated-03.svg -->
      <glyph unicode="&#xF907;" glyph-name="龜" horiz-adv-x="256" d=""/><!-- from: generated-03.svg -->
      <glyph unicode="&#xF908;" glyph-name="龜" horiz-adv-x="256" d=""/><!-- from: generated-03.svg -->
    </font>
  </defs>
</svg>

相关问题

  • 如何将XML子树从一个文件复制/移动到另一个文件?
  • 使用 xmlstarlet 将 XML 从一个文件插入到另一个文件中?

创建一个包含内容的文件collection.xml

<files>
  <file>generated-01.svg</file>
  <file>generated-02.svg</file>
  <file>generated-03.svg</file>
  ...
</files>

然后使用一个 XSLT 样式表

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0"
  xmlns:svg="http://www.w3.org/2000/svg">
<xsl:param name="col-url" select="'collection.xml'"/>
<xsl:variable name="col-doc" select="document($col-url)"/>
<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="/svg:svg/svg:defs/svg:font">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
    <xsl:copy-of select="document($col-doc/files/file)/svg:svg/svg:defs/svg:font/svg:glyph"/>
  </xsl:copy>
</xsl:template>
</xsl:stylesheet>

您可能需要添加 xsl:output 指令以在输出中添加 DOCTYPE 节点并获取缩进。

相关内容

  • 没有找到相关文章

最新更新