匹配SVG标记时,匹配子句在XSLT中不起作用

时间:2017-12-29 09:26:39

标签: xslt

我有一个相当简单的XSLT:

open

目标是采用类似于

的SVG文件
<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="no" indent="yes"/>
     <xsl:strip-space elements="*"/>

    <xsl:template match="svg">
        <svg>
        <xsl:apply-templates />
        </svg>
    </xsl:template>

    <xsl:template match="circle">
        <xsl:copy-of select='.'/>
    </xsl:template>
</xsl:stylesheet>

并制作

<?xml version="1.0" standalone="no"?>
<svg width="200" height="250" version="1.1" xmlns="http://www.w3.org/2000/svg">

    <rect x="10" y="10" width="30" height="30" stroke="black" fill="transparent" stroke-width="5"/>

    <circle cx="25" cy="75" r="20" stroke="red" fill="transparent" stroke-width="5"/>
    <ellipse cx="75" cy="75" rx="20" ry="5" stroke="red" fill="transparent" stroke-width="5"/>

    <line x1="10" x2="50" y1="110" y2="150" stroke="orange" fill="transparent" stroke-width="5"/>
    <polyline points="60 110 65 120 70 115 75 130 80 125 85 140 90 135 95 150 100 145"
              stroke="orange" fill="transparent" stroke-width="5"/>

    <polygon points="50 160 55 180 70 180 60 190 65 205 50 195 35 205 40 190 30 180 45 180"
             stroke="green" fill="transparent" stroke-width="5"/>

    <circle cx="35" cy="75" r="20" stroke="red" fill="transparent" stroke-width="5"/>

    <path d="M20,230 Q40,205 50,230 T90,230" fill="none" stroke="blue" stroke-width="5"/>
</svg>

换句话说,我想要一个仅包含此图像圆圈的SVG。

由于某些原因<svg> <circle cx="25" cy="75" r="20" stroke="red" fill="transparent" stroke-width="5"/> <circle cx="35" cy="75" r="20" stroke="red" fill="transparent" stroke-width="5"/> </svg> 条款似乎不起作用。我尝试用match代替match="svg",并且已成功生成match="/"代码,但它是空的,因为没有圈子匹配。

很可能,这是我在这里失踪的非常简单的事情。

1 个答案:

答案 0 :(得分:2)

脚本失败的基本原因(模板不匹配)是:

  • 源文件中的标记名称实际上在 http://www.w3.org/2000/svg命名空间,
  • 但您尝试引用它们不带任何命名空间。

为了使您的匹配正确,您必须:

  • xmlns:sv="http://www.w3.org/2000/svg"添加到stylesheet代码
  • 前缀标记名称为sv:

另一个变化:

  • 添加exclude-result-prefixes="sv"以防止添加名称空间 主输出标签。
  • 添加身份模板以自动复制所需内容。
  • 在模板匹配select="sv:circle"中将apply-templates添加到svn, 将子内容的处理限制为仅circle标记。

我还更改了匹配circle的模板。原因是要创造 拥有 circle标记(没有命名空间),就像您在模板中所做的那样 匹配svg

所以整个脚本可能如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:sv="http://www.w3.org/2000/svg"
  exclude-result-prefixes="sv">
  <xsl:output omit-xml-declaration="no" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="sv:svg">
    <svg>
      <xsl:apply-templates select="sv:circle"/>
    </svg>
  </xsl:template>

  <xsl:template match="sv:circle">
    <circle>
      <xsl:apply-templates select="@*|node()"/>
    </circle>
  </xsl:template>

  <xsl:template match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
  </xsl:template>
</xsl:stylesheet>