Создание 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">
Что не похоже на то, что я хочу...
Ответы
Ответ 1
Попробуйте вместо этого:
<?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 в объявлении.
Я только что составил совпадение шаблонов только для тестирования.
Ответ 2
Вот как это можно сделать:
<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>
, чтобы они могли легко (re) использоваться везде, где они необходимы. Это особенно полезно, если заданное пространство имен потребуется для более чем одного сгенерированного элемента или атрибута.
В этом случае также полезно указать все такие префиксы в значении атрибута exclude-result-prefixes
так, чтобы пространства имен не распространялись автоматически на все литеральные результирующие элементы.
Ответ 3
Вы можете просто использовать: -
<exercises xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="mySchema.xsd">
Непосредственно в вашем XSL, это сработает, вам действительно нужен xsl: element, если он не может жестко закодировать имя тега. Аналогично атрибутам вы можете добавлять их напрямую, если вам не нужно делать условные.