是否可以通过添加适当的命名空间来修复XML / SVG

时间:2014-11-26 19:23:15

标签: c# xml xslt svg

我在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,因为根据我的理解,Root节点中缺少SVG Namespace。

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

由于

1 个答案:

答案 0 :(得分:0)

以下样式表将复制源文档的默认无命名空间中的所有元素和属性,并将它们放在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>