我想做这个
<hello>
<one>
<paragraph>p1</paragraph>
</one>
</hello>
进入这个
<x:hello y:an_attribute="a value for an_attribute" xmlns:x="some_new_namespace" xmlns:y="other_ns">
<one>
<paragraph>p1</paragraph>
</one>
</x:hello>
这是我提出的样式表:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="element_localname" select="'hello'"/>
<xsl:template match="node()">
<xsl:choose>
<xsl:when test="local-name() = $element_localname">
<xsl:element name="{$element_localname}" namespace="some_new_namespace">
<xsl:attribute name="an_attribute" namespace="other_ns">a value for an_attribute</xsl:attribute>
<xsl:apply-templates select="node()"/>
</xsl:element>
</xsl:when>
<!-- copy the rest as is -->
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="node()" />
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
但是由于一些奇怪的原因,我添加到元素的属性与根元素本身具有相同的命名空间?为什么呢?
<ns0:hello xmlns:ns0="other_ns" ns0:an_attribute="a value for an_attribute">
<one>
<paragraph>p1</paragraph>
</one>
</ns0:hello>
感谢您的阅读。
答案 0 :(得分:4)
这比看起来简单得多:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="some_new_namespace" xmlns:y="other_ns"
exclude-result-prefixes="x y">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<x:hello y:an_attribute="a value for an_attribute">
<xsl:apply-templates/>
</x:hello>
</xsl:template>
</xsl:stylesheet>
将此转换应用于提供的XML文档:
<hello>
<one>
<paragraph>p1</paragraph>
</one>
</hello>
产生了想要的正确结果:
<x:hello xmlns:x="some_new_namespace" xmlns:y="other_ns" y:an_attribute="a value for an_attribute">
<one>
<paragraph>p1</paragraph>
</one>
</x:hello>
答案 1 :(得分:0)
此样式表:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="some_new_namespace"
xmlns:y="other_ns">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="element_localname" select="'hello'"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:choose>
<xsl:when test="local-name() = $element_localname">
<xsl:element name="x:{$element_localname}">
<xsl:attribute name="y:an_attribute">
<xsl:text>a value for an_attribute</xsl:text>
</xsl:attribute>
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="identity" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
输出:
<x:hello y:an_attribute="a value for an_attribute"
xmlns:y="other_ns" xmlns:x="some_new_namespace">
<one>
<paragraph>p1</paragraph>
</one>
</x:hello>