您好我想从源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>
答案 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>