Если вам не нужно, чтобы в новом расположении схемы было пространство имен xsi, сработает следующее:
<xsl:output indent="yes" method="xml"/>
<xsl:template match="/">
<xsl:apply-templates select="node()|@*"/>
</xsl:template>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*[local-name() = 'schemaLocation']">
<xsl:attribute name="schemaLocation">newSchemaLocation</xsl:attribute>
</xsl:template>
Когда вам снова понадобится пространство имен xsi, тогда, конечно, нужнобыть упомянутым в шаблонах и, таким образом, должно быть объявлено в заголовке таблицы стилей, как показано ниже, где в качестве демонстрации также функция local-name () заменена функцией name ();первый включает пространство имен, где последнее не имеет:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
...
<xsl:template match="@*[name() = 'xsi:schemaLocation']">
<xsl:attribute name="xsi:schemaLocation">newSchemaLocation</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
Обратите внимание, что оба решения полагаются на конкретные пути к шаблонам (@*[local-name()=...]
), чтобы иметь более высокий приоритет, чем менее конкретные (@*
).