Я хочу создать следующий элемент:
<exercises xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation = "mySchema.xsd">
Если я использую что-то вроде этого:
<xsl:element name = "excercises">
<xsl:attribute name = "xmlns:xsi" namespace = "http://www.w3.org/2001/XMLSchema-instance"/>
Затем он создает что-то вроде этого:
<excercises xp_0:xsi = "" xmlns:xp_0 = "http://www.w3.org/2001/XMLSchema-instance">
Что не похоже на то, что я хочу ...





Вместо этого попробуйте следующее:
<?xml version = "1.0" encoding = "utf-8"?>
<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance">
<xsl:output method = "xml" indent = "yes"/>
<xsl:template match = "@* | node()">
<xsl:apply-templates select = "xml"></xsl:apply-templates>
</xsl:template>
<xsl:template match = "xml">
<xsl:element name = "exercises">
<xsl:attribute name = "xsi:noNamespaceSchemaLocation">mySchema.xsd</xsl:attribute>
some value
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Основная задача - объявить пространство имен xsi в объявлении.
Я только что придумал совпадение с шаблоном, чтобы проверить.
Поскольку msxsl alais не используется, может быть лучше, если вы просто удалите его, это сделает пример более понятным
Вот как это можно сделать:
<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
exclude-result-prefixes = "xsi">
<xsl:output omit-xml-declaration = "yes"/>
<!-- -->
<xsl:template match = "/">
<exercises xsi:noNamespaceSchemaLocation = "mySchema.xsd"/>
</xsl:template>
</xsl:stylesheet>
Когда применяется это преобразование в любом исходном XML-документе (не используется), будет получен желаемый результат:
<exercises xsi:noNamespaceSchemaLocation = "mySchema.xsd" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" />
В вашем случае нет необходимости использовать <xsl:attribute>, однако при необходимости его можно использовать без проблем:
<xsl:attribute name = "xsi:noNamespaceSchemaLocation">
<xsl:value-of select = "'mySchema.xsd'"/>
</xsl:attribute>
Обратите внимание, что рекомендуется просто определить необходимые пространства имен в элементе <xsl:stylesheet>., чтобы их можно было (повторно) использовать везде, где они необходимы. Это особенно полезно, если данное пространство имен будет необходимо для более чем одного сгенерированного элемента или атрибута.
В этом случае также хорошо указать все такие префиксы в значении атрибута exclude-result-prefixes., чтобы пространства имен не распространялись автоматически на все литеральные элементы результата.
Зачем подавлять префикс результата xsi?
@AnthonyWJones: Если вы не включите префикс «xsi» в список значений атрибута «exclude-result-prefixes», каждый литеральный элемент результата будет выводиться как имеющий этот узел пространства имен. Это единственная цель атрибута e.r.p. Читайте здесь: w3.org/TR/xslt#literal-result-element
Вы можете просто использовать: -
<exercises xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation = "mySchema.xsd">
Непосредственно в вашем XSL это сработает, вам действительно нужен xsl: element только в том случае, если вы не можете жестко закодировать имя тега. Аналогично с атрибутами вы можете добавлять их напрямую, если вам не нужно делать условные.
Какой синтаксический анализатор XSLT вы используете?