我有这样的文件:
<?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>
我应该只提取身体内容:
<?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 :(得分:0)
你有(至少)两个问题:
如果您要完成的任务是将SVG部件输出为SVG doctype,请执行以下操作:
<xsl:output ...>
标记,其中doctype-public
和doctype-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>
答案 1 :(得分: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为我们带来了一个有趣的问题。如果输入结构与提供的结构不同,该怎么办?
一种情况:head
或body
中有文本节点。我已经编辑了两个答案。
其他情况:SVG在一些XHTML标记内。我已经编辑了两个答案。
最坏的情况:有几个svg
元素。在这种情况下,您需要将每个svg
元素包装成一个。
答案 2 :(得分: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>