给出以下源xml:
<?xml version="1.0" encoding="UTF-8"?>
<Test xmlns="http://someorg.org">
<text>
<status value="generated"/>
<div xmlns="http://www.w3.org/1999/xhtml">
<p>Some text</p>
<p>Some text</p>
</div>
</text>
</Test>
我想拥有与上面的源xml相同的输出(源xml包含许多其他xml节点但是对于本节,我想按原样输出它,没有任何更改。)我有以下xslt(见下文)根据需要剥离其命名空间的元素。不幸的是,它还剥离了名称空间的div元素,但我想保留它们。我实现目标的最接近的是下面的xslt,但它因为apply-templates而输出div元素两次,但我只希望div元素与其命名空间一次。
这是我的xslt:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:f="http://someorg.org"
xmlns="http://someorg.org"
exclude-result-prefixes="f xsl">
<xsl:template match="*">
<xsl:element name="{local-name(.)}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{local-name(.)}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match = "f:text/f:status">
<status value ="generated"/>
<div xmlns="http://www.w3.org/1999/xhtml">
<xsl:apply-templates/>
</div>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:3)
您可以只定位“http://someorg.org”命名空间中的元素,而不是尝试删除所有元素的命名空间(仅由<xsl:template match="*">
模板处理)。只需将模板匹配更改为此
<xsl:template match="f:*">
对于“http://www.w3.org/1999/xhtml”命名空间中的元素,您可以使用身份模板来获取其他所有内容
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:f="http://someorg.org">
<xsl:output method="xml" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="f:*">
<xsl:element name="{local-name(.)}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
添加模板
<xsl:template match="*[local-name()='div'
and namespace-uri() = 'http://www.w3.org/1999/xhtml']">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
执行复制而不是创建名称空间剥离的元素。