我有一些xml,我正在尝试删除其他xslt将它们添加的错误属性。
<?xml version="1.0" encoding="UTF-8"?><MYXML xmlns="http://someURL/MYXML" xmlns:role="http://someURL/role">
<firstElement>
<LANGUAGE>Spanish</LANGUAGE>
<VOCABULARY>Spain</VOCABULARY>
</firstElement>
<External xmlns="" xmlns:myxml="http://someURL/MYXML">
<EXTARData/>
<AnotherElementData>
<AnotherElement xmlns="http://someURL/AnotherElement"/>
</AnotherElementData>
</External>
</MYXML><!--checksum=A477829F524D170104E87187AD2869F5443DD079196B0EDCD5C6B9CFDD315232 version=1-->
我想摆脱掉“ xmlns =”“ xmlns:myxml =” http:// someURL / MYXML“”而没有成功。
我的预期结果是:
<?xml version="1.0" encoding="UTF-8"?><MYXML xmlns="http://someURL/MYXML" xmlns:role="http://someURL/role">
<firstElement>
<LANGUAGE>Spanish</LANGUAGE>
<VOCABULARY>Spain</VOCABULARY>
</firstElement>
<External >
<EXTARData/>
<AnotherElementData>
<AnotherElement xmlns="http://someURL/AnotherElement"/>
</AnotherElementData>
</External>
</MYXML><!--checksum=A477829F524D170104E87187AD2869F5443DD079196B0EDCD5C6B9CFDD315232 version=1-->
有人可以帮我吗?
答案 0 :(得分:0)
因此,您似乎想将没有命名空间的元素转换为根元素的命名空间:
<xsl:template match="*[namespace-uri() = '']">
<xsl:element name="{local-name()}" namespace="{namespace-uri(/*)}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
与身份转换一起提供
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[namespace-uri() = '']">
<xsl:element name="{local-name()}" namespace="{namespace-uri(/*)}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
并得到https://xsltfiddle.liberty-development.net/eiZQaFX
<MYXML xmlns="http://someURL/MYXML" xmlns:role="http://someURL/role">
<firstElement>
<LANGUAGE>Spanish</LANGUAGE>
<VOCABULARY>Spain</VOCABULARY>
</firstElement>
<External>
<EXTARData />
<AnotherElementData>
<AnotherElement xmlns="http://someURL/AnotherElement" xmlns:myxml="http://someURL/MYXML" />
</AnotherElementData>
</External>
</MYXML><!--checksum=A477829F524D170104E87187AD2869F5443DD079196B0EDCD5C6B9CFDD315232 version=1-->
如您所见,这与XSLT 1中的身份转换所显示的结果并不完全相同,它复制了xmlns:myxml="http://someURL/MYXML"
范围内的命名空间AnotherElement
。
使用XSLT 2或3处理器可以很容易地避免该问题,
请参见https://xsltfiddle.liberty-development.net/eiZQaFX/1。
使用XSLT 1处理器,您将需要更多的工作来确保复制元素时没有任何名称空间:
<xsl:template match="*[namespace-uri() = '']//*[namespace-uri() != '']">
<xsl:element name="{name()}" namespace="{namespace-uri()}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
完整的示例是
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[namespace-uri() = '']">
<xsl:element name="{local-name()}" namespace="{namespace-uri(/*)}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="*[namespace-uri() = '']//*[namespace-uri() != '']">
<xsl:element name="{name()}" namespace="{namespace-uri()}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>