我有一个xml,我想更改大多数元素的命名空间,删除一些特定的元素名称,并删除包含特定命名空间的元素。这种xml的例子
<root xmlns="somenamespace">
<elem1>sometext</eleme1>
<ns0:elem2 xmlns:ns0="othernamespace">
<ns1:elem3 xmlns:ns1="thirdnamespace" />
</ns0:elem2>
<elem4>sometext</elem4>
</root>
我正在尝试使用以下xslt:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="*[namespace-uri() = 'somenamespace']">
<xsl:choose>
<!-- change element name from root to root2 -->
<xsl:when test="local-name(.)='root'">
<xsl:element name="root2" namespace="mynamespace">
<xsl:apply-templates select="@* | node()" />
</xsl:element>
</xsl:when>
<!-- skip these elements that are not in root2 -->
<xsl:when test="local-name(.)='elem1'" />
<xsl:when test="namespace-uri()='othernamespace'" />
<!-- Copy other elemnts -->
<xsl:otherwise>
<xsl:element name="{name()}" namespace="mynamespace">
<xsl:apply-templates select="@* | node()" />
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Copy the rest -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
输出xml应为
<root2 xmlns="mynamespace">
<elem4>sometext</elem4>
</root2>
但结果是
<root2 xmlns="mynamespace" xmlns:ns0="othernamespace">
<ns0:elem2>
<ns1:elem3 xmlns:ns1="thirdnamespace" />
</ns0:elem2>
<elem4>sometext</elem4>
</root2>
似乎xslt的大多数元素都在工作,除了应该删除特定命名空间的所有元素的元素。上面的xslt有什么问题吗?
答案 0 :(得分:0)
您的第一个模板仅匹配somenamespace
命名空间中的元素。其他名称空间(othernamespace
,thirdnamespace
)由标识转换(最后一个模板)匹配,并按原样输出。
要删除somenamespace
命名空间中不包含的所有元素,请添加以下模板:
<xsl:template match="*[not(namespace-uri()='somenamespace')]" priority="1"/>