2008-09-27 3 views
10

У меня есть документ XML с элементами, не содержащими имен, и я хочу использовать XSLT для добавления им пространств имен. Большинство элементов будут в пространстве имен A; некоторые из них будут в пространстве имен B. Как мне это сделать?Добавить пространство имен в элементы

ответ

13

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

Это то, что вы ищете?

+0

Yup; Я подошел к ответу до вашего поста, и это было практически то же самое. Единственное отличие состоит в том, что вместо этого я использую , но я считаю, что они функционально идентичны. – 2008-09-28 00:01:09

0

Вот что я до сих пор:

<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, по-видимому, не сокращает его).

+1

Вы не прочли правильную документацию. Используйте силу, прочитайте спецификацию, она очень хорошо написана и доступна. – ddaa 2008-09-27 23:39:23

2

Вам понадобятся два основных ингредиента для этого рецепта.

Соус для соусов будет identity transform, а основной аромат будет присвоен атрибутом 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> 

Личное сообщение: Hello, Jeni Tennison. Я знаю, что вы читаете это.

Смежные вопросы