xslt问题(名称空间?)

时间:2010-06-30 16:48:41

标签: xml xslt xhtml namespaces

我有这样的文件:

<?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>

但它不起作用

3 个答案:

答案 0 :(得分:0)

你有(至少)两个问题:

  1. 默认名称空间不同,因此XSL中的模板匹配将不起作用。在样式表中使它们匹配或提供显式的名称空间前缀。
  2. select-of-select将返回body元素的文本值,这可能不是您想要的。
  3. 如果您要完成的任务是将SVG部件输出为SVG doctype,请执行以下操作:

    1. Google“XSL Identity Transform”,了解如何从输入到输出执行“深层复制”。
    2. 添加<xsl:output ...>标记,其中doctype-publicdoctype-system属性指定您要输出的文档类型信息。
    3. 这是未经测试的,但应该非常接近。您必须添加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为我们带来了一个有趣的问题。如果输入结构与提供的结构不同,该怎么办? 一种情况:headbody中有文本节点。我已经编辑了两个答案。 其他情况: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>