【问题标题】:Is it possible to fix XML / SVG by adding proper namespace是否可以通过添加适当的命名空间来修复 XML / SVG
【发布时间】:2015-01-25 06:16:01
【问题描述】:

我在 Inkscape 中构建了以下 SVG,您可以看到它缺少 SVG 命名空间:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg width="1000" height="715" id="svg2" p1:version="0.32" p2:version="0.46" version="1.0" p2:output_extension="org.inkscape.output.svg.inkscape" xmlns:p1="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:p2="http://www.inkscape.org/namespaces/inkscape">
  <defs id="defs4">
    <perspective p1:type="inkscape:persp3d" p2:vp_x="0 : 526.18109 : 1" p2:vp_y="0 : 1000 : 0" p2:vp_z="744.09448 : 526.18109 : 1" p2:persp3d-origin="372.04724 : 350.78739 : 1" id="perspective10" />
    <perspective id="perspective2447" p2:persp3d-origin="372.04724 : 350.78739 : 1" p2:vp_z="744.09448 : 526.18109 : 1" p2:vp_y="0 : 1000 : 0" p2:vp_x="0 : 526.18109 : 1" p1:type="inkscape:persp3d" />
    <perspective id="perspective3327" p2:persp3d-origin="372.04724 : 350.78739 : 1" p2:vp_z="744.09448 : 526.18109 : 1" p2:vp_y="0 : 1000 : 0" p2:vp_x="0 : 526.18109 : 1" p1:type="inkscape:persp3d" />
  </defs>
  <namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" gridtolerance="10000" guidetolerance="10" objecttolerance="10" p2:pageopacity="0.0" p2:pageshadow="2" p2:zoom="7" p2:cx="324.34286" p2:cy="238.59584" p2:document-units="px" p2:current-layer="svg2" showgrid="false" p2:window-width="1020" p2:window-height="718" p2:window-x="0" p2:window-y="14" />
  <metadata id="metadata7">
    <RDF>
      <Work p6:about="" xmlns:p6="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
        <format>image/svg+xml</format>
        <type p6:resource="http://purl.org/dc/dcmitype/StillImage" />
      </Work>
    </RDF>
  </metadata>
    <rect style="opacity:0.92000002;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.00288939;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="rect2473" width="172.33044" height="88.997108" x="419.00143" y="315.00143" rx="0.30000001" ry="0.30000001" />
</svg>

以下 XSLT 转换用于剥离所有不必要的信息:

<xsl:stylesheet version=""1.0""
    xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" 
    xmlns:svg=""http://www.w3.org/2000/svg"">

    <!-- Any element matching svg namespace is copied. -->
    <xsl:template match=""svg:*"">
        <xsl:copy>
        <xsl:copy-of select=""@*[namespace-uri()='']""/>
        <xsl:apply-templates select=""node()""/>
        </xsl:copy>
    </xsl:template>

    <!-- Default: Exclude element -->
    <xsl:template match=""*""/>

</xsl:stylesheet>

运行 XSLT 转换时,它会生成空 XML,因为据我了解,根节点中缺少 SVG 命名空间。

所以我的问题是是否有可能以某种方式解决这个问题?我确实尝试将命名空间添加到文档的根节点,但它没有帮助。

谢谢

【问题讨论】:

  • 您能告诉我们转换的预期结果吗?
  • 这首先不能验证为 svg,在 svg 中没有名为 &lt;namedview&gt;&lt;perspective&gt; 的元素。

标签: c# xml xslt svg


【解决方案1】:

以下样式表将复制源文档默认无命名空间中的所有元素和属性,并将它们放置在 SVG 命名空间中:

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/2000/svg">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="*[not(namespace-uri())]">
    <xsl:element name="{local-name()}">
        <xsl:copy-of select="@*[not(namespace-uri())]"/>
        <xsl:apply-templates select="node()"/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

应用于您的输入示例,结果为:

<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="715" id="svg2" version="1.0">
   <defs id="defs4">
      <perspective id="perspective10"/>
      <perspective id="perspective2447"/>
      <perspective id="perspective3327"/>
   </defs>
   <namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" gridtolerance="10000" guidetolerance="10" objecttolerance="10" showgrid="false"/>
   <metadata id="metadata7">
      <RDF>
         <Work>
            <format>image/svg+xml</format>
            <type/>
         </Work>
      </RDF>
   </metadata>
   <rect style="opacity:0.92000002;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1.00288939;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="rect2473" width="172.33044" height="88.997108" x="419.00143" y="315.00143" rx="0.30000001" ry="0.30000001"/>
</svg>

【讨论】:

  • 感谢您的回复。但是使用 XSLT 的整个想法是从原始源中删除非 SVG 元素。使用您提供的 XLST,它不会那样做。
  • @Hayk 您必须提供识别 SVG(或非 SVG)元素的标准。 -- 仅供参考:上述转换的结果在浏览器中呈现为 SVG - 尽管有非 SVG 元素。
  • SVG 标准由“w3.org/2000/svg”命名空间定义。虽然生成的 XML 将在浏览器中呈现,但它将包含不属于 SVG 命名空间的元素,例如 RDF、Work 等。目标是清理源 XML,因此只有属于 SVG 命名空间的元素才会包含在最终版本中。
  • @Hayk 恐怕我们不在同一个页面上。您输入的问题是 SVG 元素位于无命名空间中,而不是位于 SVG 命名空间中。上述解决方案将源文档的 all 无命名空间元素放置在 SVG 命名空间中(并删除其他命名空间中的元素)。为了在 SVG 命名空间中只放置 一些 元素,样式表必须“知道”哪些元素是 SVG,哪些不是。此信息在您的输入中不可用 - 因此如果没有进一步输入,此任务是不可能的。
  • P.S.我的计算机上有 Inkscape,当我保存文件时,所有元素都在其正确的命名空间中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 2022-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
相关资源
最近更新 更多