Если вы буквально хотите получить результат, как показано в вопросе, это очень просто: :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="/">
<xml:namespace prefix="vml" ns="urn:schemas-microsoft-com:vml"/>
</xsl:template>
</xsl:stylesheet>
Это преобразование при применении к любому документу XML (не используется), выдает желаемый результат :
<xml:namespace prefix="vml" ns="urn:schemas-microsoft-com:vml"/>
Однако мне кажется, что вы хотите добавить узел пространства имен к каждому элементу данного XML-документа (если это не так), просто дайте мне знать через комментарий, и я удалю этот ответ).
Если это так, вот простой и эффективный способ:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:vml="urn:schemas-microsoft-com:vml"
exclude-result-prefixes="vml">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vNamespace" select=
"document('')/*/namespace::*[name()='vml']"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:copy-of select="$vNamespace"/>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
применительно к любому документуНапример, этот :
<t>
<a x="3">
<b y="4"/>
</a>
</t>
желаемый результат получается :
<t xmlns:vml="urn:schemas-microsoft-com:vml">
<a x="3">
<b y="4"/>
</a>
</t>
Это может сбить с толку на первый взгляд , поскольку только верхний элемент результата имеет видимый узел пространства имен.Однако по определению (смотрите спецификацию пространства имен XML ), если элемент в корне (под) дерева имеет данный узел пространства имен, то все его дочерние элементы также имеютэтот узел пространства имен.Даже если вы скопируете пространство имен для каждого элемента, сериализатор XSLT удалит его из сериализованного (текстового) представления всех элементов, кроме верхнего.
В XSLT 2.0 вы можете просто использовать <xsl:namespace>
инструкция :
<xsl:namespace name="vml" select="urn:schemas-microsoft-com:vml"/>