XSLT tag raiz namespace em vez de elemento namespace atributo

votos
7

Eu tenho um arquivo XSL para transferir outro arquivo XSL. Eu quero a declaração de namespace para estar na tag raiz, ao invés de ser repetido em cada elemento !!

Aqui é o meu estilo:

<xsl:stylesheet xmlns:xsl=http://www.w3.org/1999/XSL/Transform xmlns:mynamespace=somenamespace version=2.0>
    <xsl:output method=xml omit-xml-declaration=no standalone=yes indent=yes />
    <xsl:template match=myMatchedNode>
        <mynamespace:tag>Some text i want inserted into the xsl</mynamespace:tag>
        <xsl:copy>
            <xsl:apply-templates select=@*|node() /></xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Ele produz algo como isto:

....

<mynamespace:tag xmlns:mynamespace=somenamespace>Some text i want inserted into the xsl</mynamespace:tag>

....

Como faço para forçar a declaração de namespace na tag raiz do resultado ?!

Publicado 19/05/2009 em 23:02
fonte usuário
Em outras línguas...                            


2 respostas

votos
8

Você precisa inserir o nó namespace para o elemento do documento de sua árvore de resultado. Existem várias maneiras de fazer isso, dependendo se você estiver usando XSLT 1.0 ou 2.0. O que se segue é uma solução a 2,0. Estou assumindo que você está fazendo uma identidade transformada modificada no documento de entrada (a sua pergunta realmente não especifique):

<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <!-- special rule for the document element -->
  <xsl:template match="/*">
    <xsl:copy>
      <!-- Add a namespace node -->
      <xsl:namespace name="mynamespace" select="'somenamespace'"/>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- the identity template -->
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- the rest of your rules -->

</xsl:stylesheet>

Para a cobertura completa de todas as diferentes técnicas para controlar namespaces no documento de saída, consulte a "não é suficiente namespaces" seção do artigo "Namespaces em XSLT" no meu site.

Respondeu 20/05/2009 em 01:47
fonte usuário

votos
1

Talvez eu entenda mal a pergunta, mas eu acho que você deve fazer isso:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="somenamespace"
    version="2.0">

<xsl:output method="xml" omit-xml-declaration="no" standalone="yes"  indent="yes"/>

<xsl:template match="myMatchedNode">
  <tag>Some text i want inserted into the xsl</mynamespace>

  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

Isso deve permitir que você use as tags de namespace como o namespace padrão eo documento de saída vai tê-los como o namespace padrão também. O seu documento de entrada ainda pode usar o mynamespace desagradável: sintaxe tag.

Você poderia tentar fazer isso, também:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="somenamespace"
    xmlns:mynamespace="somenamespace"
    version="2.0">

Eu não sou inteiramente certo que irá substituir mynamespace: tag com apenas tag embora, e se isso acontecer, ele pode ser dependente de implementação.

Respondeu 19/05/2009 em 23:58
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more