У меня есть документ XML с элементами, не содержащими имен, и я хочу использовать XSLT для добавления им пространств имен. Большинство элементов будут в пространстве имен A; несколько будут в пространстве имен B. Как это сделать?
Добавление пространства имен в элементы
Ответ 1
С foo.xml
<foo x="1">
<bar y="2">
<baz z="3"/>
</bar>
<a-special-element n="8"/>
</foo>
и foo.xsl
<xsl:template match="*">
<xsl:element name="{local-name()}" namespace="A" >
<xsl:copy-of select="attribute::*"/>
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="a-special-element">
<B:a-special-element xmlns:B="B">
<xsl:apply-templates match="children()"/>
</B:a-special-element>
</xsl:template>
</xsl:transform>
Я получаю
<foo xmlns="A" x="1">
<bar y="2">
<baz z="3"/>
</bar>
<B:a-special-element xmlns:B="B"/>
</foo>
Это то, что вы ищете?
Ответ 2
Вам понадобятся два основных ингредиента для этого рецепта.
Запасом соуса будет преобразование идентичности, а основной аромат будет передаваться атрибутом namespace
в xsl:element
.
Следующий, непроверенный код должен добавить http://example.com/ пространство имен ко всем элементам.
<xsl:template match="*">
<xsl:element name="xmpl:{local-name()}" namespace="http://example.com/">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
Личное сообщение: Здравствуйте, Jeni Tennison. Я знаю, что вы читаете это.
Ответ 3
Вот что я до сих пор:
<xsl:template match="*">
<xsl:element name="{local-name()}" namespace="A" >
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="a-special-element">
<B:a-special-element xmlns:B="B">
<xsl:apply-templates />
</B:a-special-element>
</xsl:template>
Это почти работает; проблема в том, что он не копирует атрибуты. Из того, что я прочитал так, элемент xsl: не имеет способа скопировать все атрибуты из элемента as-is (use-attribute-sets, по-видимому, не сокращает его).