这对于 XSLT 来说是直截了当的。
这是一个执行所有必需替换的示例:
鉴于此源 XML 文件:
<html xmlns:old="old:namespace">
<head>
<meta property="og:type" content="webcontent"/>
</head>
<view>Some View</view>
<body>
The Body here.
</body>
</html>
此转换执行所有请求的更改:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:h="some:h" xmlns:old="old:namespace" xmlns:new="new:new"
exclude-result-prefixes="h new old">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vnsH" select="document('')/*/namespace::h"/>
<xsl:variable name="vnsNew" select="document('')/*/namespace::new"/>
<xsl:template match="*">
<xsl:element name="{name()}" namespace="{namespace-uri()}">
<xsl:copy-of select="namespace::*[not(name()='old')]"/>
<xsl:if test="namespace::old">
<xsl:copy-of select="$vnsNew"/>
</xsl:if>
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{name()}" namespace="{namespace-uri()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
<xsl:template match="node()[not(self::*)]">
<xsl:copy/>
</xsl:template>
<xsl:template match="view"/>
<xsl:template match="/*">
<xsl:element name="{name()}">
<xsl:copy-of select="namespace::*[not(name()='old')]|$vnsH"/>
<xsl:if test="namespace::old">
<xsl:copy-of select="$vnsNew"/>
</xsl:if>
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="head|body">
<xsl:element name="h:{name()}" namespace="some:h">
<xsl:copy-of select="namespace::*[not(name()='old')]"/>
<xsl:if test="namespace::old">
<xsl:copy-of select="$vnsNew"/>
</xsl:if>
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
当应用于上述 XML 文档时,会产生所需的正确结果:
<html xmlns:h="some:h" xmlns:new="new:new">
<h:head>
<meta property="og:type" content="webcontent"/>
</h:head>
<h:body>
The Body here.
</h:body>
</html>
请注意:
<view>
已被删除。
<head>
和<body>
转换为<h:head>
和<h:body>
。
命名空间现在old
替换为new
命名空间。