删除xmlns属性并重命名根节点

时间:2012-11-12 21:07:54

标签: xml xslt-2.0 xml-namespaces

您好我想从源xhtml / xml文件中删除xmlns="http://www.w3.org/1999/xhtml"命名空间并重命名根节点,并希望尝试仅使用一个样式表执行此操作。这可能吗?

以下是我的示例源xml / xhtml:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title/>
  <meta/>
</head>

<body link="#000000" bgcolor="#FFFFFF" leftmargin="0">
<div>
  <p>Here is a paragraph</p>
</div>
</body>
</html>

这是我想要的输出:

<document>
  <section>
    <paragraph>Here is a paragraph</paragraph>
  </section>
</document>

目前,我只能使用两个样式表(见下文)来实现此结果,但我希望能够将这些说明组合到一个样式表中。这是可能的,如果是的话,怎么样?提前感谢您的帮助。

目前的样式表1:

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

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

<xsl:template match="@*">
  <xsl:attribute name="{local-name()}"><xsl:value-of select="."/></xsl:attribute>
<xsl:apply-templates/>`
</xsl:template>`

<xsl:template match="*">
  <xsl:element name="{local-name()}">
    <xsl:apply-templates select="*|@*|node()"/>
  </xsl:element>
</xsl:template>

</xsl:stylesheet>

目前的样式表2:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

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

<xsl:template match="html">
  <document>
    <xsl:apply-templates select="*|@*|text()"/>
  </document>
</xsl:template>

<xsl:template match="div">
  <section>
    <xsl:apply-templates select="*|@*|text()"/>
  </section>`
</xsl:template>`

<xsl:template match="p">
  <paragraph>
    <xsl:apply-templates select="*|@*|text()"/>
  </paragraph>
</xsl:template>`

<xsl:template match="head"/>

</xsl:stylesheet>

4 个答案:

答案 0 :(得分:3)

由于您使用的是XSLT 2.0,所以您需要做的就是添加

xpath-default-namespace="http://www.w3.org/1999/xhtml"

到样式表2,作业完成。

答案 1 :(得分:1)

有几种不同的方法可以做到这一点。这是一个。

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

<xsl:template match="*">
  <xsl:element name="{local-name()}">
    <xsl:apply-templates select="@*|node()" />
  </xsl:element>
</xsl:template>

<xsl:template match="@*|comment()|processing-instruction()|text()">
  <xsl:copy />
</xsl:template>

<xsl:template match="/*"><!-- xhtml:html -->
  <document>
    <xsl:apply-templates select="@*|node()" />
  </document>
</xsl:template>

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

<xsl:template match="xhtml:div">
  <section>
    <xsl:apply-templates select="@*|node()" />
  </section>`
</xsl:template>`

<xsl:template match="xhtml:p">
  <paragraph>
    <xsl:apply-templates select="@*|node()" />
  </paragraph>
</xsl:template>`

<xsl:template match="xhtml:head"/>

</xsl:stylesheet>

<强>更新 我忘了将xhtml:添加到模板匹配中。现已更正。

答案 2 :(得分:1)

就是这个

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:x="http://www.w3.org/1999/xhtml" exclude-result-prefixes="x">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="x:div">
  <section><xsl:apply-templates/></section>
 </xsl:template>

 <xsl:template match="x:p">
  <paragraph><xsl:apply-templates/></paragraph>
 </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时:

<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title/>
        <meta/>
    </head>
    <body link="#000000" bgcolor="#FFFFFF" leftmargin="0">
        <div>
            <p>Here is a paragraph</p>
        </div>
    </body>
</html>

产生了想要的正确结果

<document>
   <section>
      <paragraph>Here is a paragraph</paragraph>
   </section>
</document>

答案 3 :(得分:1)

对于xslt 2.0解决方案,添加到Michael Kay的早期答案中,以下模板也将阻止命名空间被添加到根元素的子元素中:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xpath-default-namespace="http://www.w3.org/1999/xhtml">

<xsl:template match="*[namespace-uri() = 'http://www.w3.org/1999/xhtml']">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="*|@*|text()"/>
</xsl:element>
</xsl:template> 

</xsl:stylesheet>