Добавить пространство имен к элементам - PullRequest
10 голосов
/ 28 сентября 2008

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

Ответы [ 3 ]

13 голосов
/ 28 сентября 2008

С 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 голосов
/ 28 сентября 2008

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

Под соусом будет тождественное преобразование , а основной аромат будет задан атрибутом 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>

Личное сообщение: Привет, Джени Теннисон. Я знаю, что вы читаете это.

0 голосов
/ 28 сентября 2008

Вот что у меня есть:

<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 не имеет возможности скопировать все атрибуты из элемента «как есть» (наборы атрибутов использования, кажется, не обрезают его).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...