0

我正在尝试重新创建一批(360 个文件)SV​​G,因为它们被赋予了一个<clip path>指向<rect>标签内标签的<defs>标签。它还创建了一个<polygon>具有填充属性的元素。我正在尝试删除<clipPath>,<defs><polygon>标签,但保留<rect>标签并为其赋予多边形的填充属性。

我试图在正则表达式中做到这一点,但它太复杂了,似乎不能很好地完成。

我尝试使用 xml 解析器类在 java 中进行操作,但我无法弄清楚如何访问属性(我尝试使用该.getAttributes()方法,但它不会提取元素的属性)。

这是我的一些示例代码:

<defs>
    <rect id="SVGID_1_" y="0" width="1023.88" height="100.08"/>
</defs>
<clipPath id="SVGID_2_">
    <use xlink:href="#SVGID_1_"  display="none" overflow="visible"/>
</clipPath>
<polygon clip-path="url(#SVGID_2_)" fill="#E81E25" points="-0.12,0 -0.12,100.08 1023.88,100.08 1023.88,0"/>

这应该是:

<rect fill="#E81E25" width="1023.88" height="100.08"/>

<rect>如何使用标签将 360 文件批量转换为我想要的格式?

4

2 回答 2

0

XSLT 将是完美的选择。那是你想要的吗:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:svg="http://www.w3.org/2000/svg"
  xmlns:xlink="http://www.w3.org/1999/xlink"
  xmlns="http://www.w3.org/2000/svg">

  <!-- Identity transform for all cases except the ones we want to delete -->
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <!-- We do nothing for clipPaths and polygons -->
  <xsl:template match="svg:clipPath|svg:polygon"/>

  <!-- We only copy rects from defs -->
  <xsl:template match="svg:defs">
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="svg:rect">
    <xsl:variable name="clipPathId" select="//svg:use[substring(@xlink:href,2) = current()/@id]/../@id"/>
    <rect>
      <xsl:copy-of select="@*"/>
      <xsl:copy-of select="//svg:polygon[@clip-path=concat('url(#', $clipPathId, ')')]/@fill"/>
    </rect>
  </xsl:template>
</xsl:stylesheet>

这假设您要删除所有 <clipPath>元素以及<polygon>剥离所有<defs>元素,只保留<rect>在内部找到的元素。

使用您喜欢的任何 XSLT 处理器(Saxon、Xalan、xsltproc、msxsl...)。

于 2013-11-11T06:32:31.513 回答
0

序言:由于您的文件是由其他程序生成的,因此您可以毫无风险地假设所有标签看起来都相同,因此您可以尝试忽略它是“xml”:风险很小。如果您的文件来自不同的来源(或该程序的不同版本),我的建议将不起作用,或者至少更复杂!

我要做的是解析(每个)文件,拆分数据并重新组合它,这只是一个提示,我尽量不要使用语言特定的东西:

- 让我们称之为 - 您可以使用的主要 id 是:“id=SVGID_xxx_”

迭代提供文件和正则表达式:

<rect.*id="([^"]*).*width="([^"]*).*height="([^"]*)
           ^--R1            ^--R2          ^--R3

保留数据(取决于您的语言)

rect_array[R1].width=R2     // or $rect_list[$R1]["w"]=R2; // php like
rect_array[R1].height=R3

然后是第二次迭代

<polygon.*?\(([^)]*).*?fill=.([^'"]*)
           ^--R1 (id again)   ^--color     

并将其添加到您的哈希/数组/映射中

rect_array[R1].fill=color     // or $rect_list[$R1]["f"]=color; // php like

最后一步是遍历您的列表/数组并重新设置它

for_all_in(rect_array).do    // foreach($rect_array as $rd) 
puts/echo rect="<rect ...    //   echo "<rect width='rd[w]' ... 

高温高压

于 2013-11-11T18:00:57.350 回答