Создайте пространство имен и атрибут xmlns: xsi

Я хочу создать следующий элемент:

<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">

Что не похоже на то, что я хочу ...

Какой синтаксический анализатор XSLT вы используете?

Kev 08.01.2009 17:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
1
35 847
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вместо этого попробуйте следующее:

<?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 не используется, может быть лучше, если вы просто удалите его, это сделает пример более понятным

AnthonyWJones 08.01.2009 17:17

Вот как это можно сделать:

<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 08.01.2009 17:24

@AnthonyWJones: Если вы не включите префикс «xsi» в список значений атрибута «exclude-result-prefixes», каждый литеральный элемент результата будет выводиться как имеющий этот узел пространства имен. Это единственная цель атрибута e.r.p. Читайте здесь: w3.org/TR/xslt#literal-result-element

Dimitre Novatchev 08.01.2009 20:14

Вы можете просто использовать: -

<exercises xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation = "mySchema.xsd">

Непосредственно в вашем XSL это сработает, вам действительно нужен xsl: element только в том случае, если вы не можете жестко закодировать имя тега. Аналогично с атрибутами вы можете добавлять их напрямую, если вам не нужно делать условные.

Другие вопросы по теме