2010-06-30 145 views
2

我有一个这样的文件:XSLT问题(命名空间?)

<?xml-stylesheet type="text/css" href="http://ltw1001.web.cs.unibo.it/svg.css" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:svg= "http://www.w3.org/2000/svg"> 
<body> 
<svg:svg width="500" height="560" version="1.1" > 

... 
... 

</svg:svg></body></html> 

我只能提取体的我TRED与内容:

<?xml version="1.0" standalone="no"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="http://www.w3.org/HTML/1998/html4"> 
    <xsl:template match="/"> 
     <xsl:value-of select="//body" /> 
    </xsl:template> 
</xsl:stylesheet> 

,但它不工作

+0

好问题(+1)。查看我的答案,了解适用于任何文档结构的完整且简单的解决方案。 – 2010-06-30 19:19:27

回答

0

您有(至少)两个问题:

  1. 默认名称空间不同,因此XSL中的模板匹配不起作用。使它们匹配或在样式表中提供明确的名称空间前缀。
  2. select-value将返回body元素的文本值,这可能不是您想要的值。

如果你想完成所有待输出SVG部分作为SVG文档类型,然后执行以下操作:

  1. 谷歌“XSL恒等变换”,以了解如何做一个“深复制“从输入到输出。
  2. 添加一个<xsl:output ...>标记doctype-publicdoctype-system属性,指定要输出的文档类型信息。

这是未经测试的,但应该非常接近。您必须添加doctype信息:

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

    <xsl:output method="xml" doctype-public="..." doctype-system="..."/> 

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

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

</xsl:stylesheet> 
+0

我应该将其转换为如下的svg文档: <?xml version =“1.0”standalone =“no”?> <!DOCTYPE svg PUBLIC“ - // W3C // DTD SVG 1.1 // EN” “ http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd“> Erick 2010-06-30 17:11:22

0

在这种情况下,身份转换是无用的。我会尝试:

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

    <xsl:output method="xml" doctype-public="-//W3C//DTD SVG 1.1//EN" doctype-system="http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" /> 

    <xsl:template match="/"> 
    <xsl:copy-of select="/*/xhtml:body//svg:svg"/>  
    </xsl:template> 

</xsl:stylesheet> 

编辑:如果你想美化事情有点:

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

    <xsl:output method="xml" doctype-public="-//W3C//DTD SVG 1.1//EN" doctype-system="http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" /> 

    <xsl:template match="text()"/> 

    <xsl:template match="svg:svg"> 
     <xsl:call-template name="svg"/> 
    </xsl:template> 

    <xsl:template match="svg:*" mode="svg" name="svg"> 
     <xsl:element name="{substring-after(name(),':')}" namespace="http://www.w3.org/2000/svg"> 
      <xsl:apply-templates select="@*|node()" mode="svg"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="@*" mode="svg"> 
     <xsl:copy/> 
    </xsl:template> 
</xsl:stylesheet> 

编辑2:Dimitre给我们带来了一个有趣的问题。如果输入结构不像所提供的结构呢? 一种情况:headbody中有文本节点。我编辑了两个答案。 其他情况:SVG在一些XHTML标记内。我编辑了两个答案。 最坏情况:有几个svg元素。在这种情况下,您需要将每个svg元素都合并为一个元素。

0

该转化

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xhtml="http://www.w3.org/1999/xhtml" 
> 
<xsl:output omit-xml-declaration="yes" indent="yes" 
    doctype-public="-//W3C//DTD SVG 1.1//EN"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="*[not(descendant::xhtml:body)]"/> 

<xsl:template match="*[descendant::xhtml:body]"> 
    <xsl:apply-templates select="*"/> 
</xsl:template> 

<xsl:template match="xhtml:body" priority="20"> 
    <xsl:copy-of select="node()"/> 
</xsl:template> 
</xsl:stylesheet> 

当所提供的XML文档施加:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:svg= "http://www.w3.org/2000/svg"> 
<body> 
<svg:svg width="500" height="560" version="1.1" > 

... 
... 

</svg:svg></body></html> 

产生想要的结果

<!DOCTYPE svg:svg PUBLIC "-//W3C//DTD SVG 1.1//EN"> 
<svg:svg width="500" height="560" version="1.1" xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg"> 

... 
... 

</svg:svg>