我的输入XML就像这样 -
<Integer xmlns="www.maths.com" xmlns:abc="www.dateTypes.com" xmlns:def="www.calculations.com">
<ID>A1</ID>
<abc:Date>2005-11-20</abc:Date>
<Type>12345</Type>
<def:Maths>Multiply</def:Maths>
</Integer>
我想通过XSL 1.0将名称空间添加到具有相同前缀但具有不同值的根元素。 我希望我的输出像 -
<Integer xmlns="www.maths.com" xmlns:abc="www.dateTypes-2.0" xmlns:def="www.calculations-2.0">
<ID>A1</ID>
<abc:Date>2005-11-20</abc:Date>
<Type>12345</Type>
<def:Maths>Multiply</def:Maths>
</Integer>
请建议。
答案 0 :(得分:0)
这应该可以解决问题:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:abc="www.dateTypes-2.0" xmlns:def="www.calculations-2.0"
xmlns:oldabc="www.dateTypes.com" xmlns:olddef="www.calculations.com"
xmlns:maths="www.maths.com"
exclude-result-prefixes="oldabc olddef maths">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="oldabc:*">
<xsl:element name="abc:{local-name()}">
<xsl:apply-templates select="@* | node()" />
</xsl:element>
</xsl:template>
<xsl:template match="olddef:*">
<xsl:element name="def:{local-name()}">
<xsl:apply-templates select="@* | node()" />
</xsl:element>
</xsl:template>
<xsl:template match="@oldabc:*">
<xsl:attribute name="abc:{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
<xsl:template match="@olddef:*">
<xsl:attribute name="def:{local-name()}">
<xsl:value-of select="." />
</xsl:attribute>
</xsl:template>
<xsl:template match="@* | text()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{name()}" namespace="{namespace-uri()}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="/maths:Integer">
<Integer xmlns="www.maths.com" xmlns:abc="www.dateTypes-2.0" xmlns:def="www.calculations-2.0">
<xsl:apply-templates select="@* | node()"/>
</Integer>
</xsl:template>
</xsl:stylesheet>
当在示例输入上运行上述XSLT时,它会产生预期结果:
<Integer xmlns="www.maths.com" xmlns:abc="www.dateTypes-2.0" xmlns:def="www.calculations-2.0">
<ID>A1</ID>
<abc:Date>2005-11-20</abc:Date>
<Type>12345</Type>
<def:Maths>Multiply</def:Maths>
</Integer>
答案 1 :(得分:0)
更短的解决方案:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:abc="www.dateTypes-2.0" xmlns:def="www.calculations-2.0">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vNS" select=
"document('')/*/namespace::*[name()='abc' or name()='def']"/>
<xsl:variable name="vDefNS" select="/*/namespace::*[not(name())]"/>
<xsl:template match="*">
<xsl:element name="{name()}">
<xsl:copy-of select="$vDefNS"/>
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
<xsl:template match="*[name()=local-name()]">
<xsl:element name="{name()}" namespace="{$vDefNS}">
<xsl:copy-of select="$vNS"/>
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
将此转换应用于以下XML文档(与提供的文档相同,但添加了一个属性以使其更具代表性):
<Integer xmlns="www.maths.com"
xmlns:abc="www.dateTypes.com" xmlns:def="www.calculations.com">
<ID>A1</ID>
<abc:Date>2005-11-20</abc:Date>
<Type abc:x="1">12345</Type>
<def:Maths>Multiply</def:Maths>
</Integer>
产生了想要的正确结果:
<Integer xmlns="www.maths.com" xmlns:abc="www.dateTypes-2.0" xmlns:def="www.calculations-2.0">
<ID>A1</ID>
<abc:Date>2005-11-20</abc:Date>
<Type abc:x="1">12345</Type>
<def:Maths>Multiply</def:Maths>
</Integer>