Добавьте пространство имен к элементам
-
02-07-2019 - |
Вопрос
У меня есть XML-документ с элементами без пространства имен, и я хочу использовать XSLT для добавления к ним пространств имен.Большинство элементов будут находиться в пространстве имен A;некоторые из них будут находиться в пространстве имен B.Как мне это сделать?
Решение
С помощью 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>
Это то, что вы ищете?
Другие советы
Для этого рецепта вам понадобятся два основных ингредиента.
Бульон для соуса будет преобразование личности, а основной аромат будет придавать 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>
Личное сообщение:Привет, Джени Теннисон.Я знаю, что ты это читаешь.
Вот что у меня есть на данный момент:
<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:element нет способа скопировать все атрибуты из элемента как есть (похоже, что использование-attribute-sets не позволяет его сократить).