Pergunta

Eu tenho um XSLT que eu criei para lidar com um documento xml particular. No entanto, agora namespaces estão sendo introduzidos em alguns, mas não todos os nossos documentos. Eu gostaria de usar o mesmo XSLT para estes documentos, no entanto estou tendo problemas para modificar o meu estilo de ser namespace agnóstico.

Tem sido sugerido anteriormente para modificar meus XPaths para *[local-name()="ElementName"], no entanto, considerando que já fez uma folha de estilo, isso é muito trabalho intensivo.

Além disso, estou ciente de que eu possa definir o xpath-default-namespace ao namespace particular, mas como mencionado anteriormente, não posso simplesmente configurá-lo para #all ou uma lista de possíveis namespaces. Eu estou procurando uma solução mais eficaz e ter as funções de extensão do processador Saxon disponível para mim. Alguma ideia? Obrigado.

Foi útil?

Solução

Você considerou pré-processamento de seus documentos XML?

Você pode remover todos os namespaces (estar ciente de possíveis confrontos) e depois processá-lo usando a transformação XSL existente.

Tal abordagem teria a vantagem de que você não tem que modificar seu XSLT em tudo. Ele permanece legível (a * [locais-name () = 'FROB'] aparência tão horrível) e sustentável.

Outras dicas

Após novas consultas, parece que simplesmente não há maneira fácil de sair deste. O XSLT deve ser redesenhado para ser namespace agnóstico, ou usar o atributo xpath-default-namespace no elemento <xsl:stylesheet>. Se quisermos preservar o espaço de nomes do documento de entrada, mas ainda tem um trabalho de estilo com vários namespaces, em seguida, os nossos modelos seria necessário para se parecer com a seguinte forma:

<xsl:template match="*[local-name(.)='ElementName']">
   <xsl:element name="{local-name(.)}" xmlns="http://yourURIhere">
      <xsl:value-of select="."/>
   </xsl:element>
</xsl:template/>

etc.

Talvez eu não entendo o seu problema, mas você não pode apenas ter o seu modelo (s) corresponde tanto a versão nulo namespace e a versão namespace do elemento? - Como esta:

<xsl:template match="ElementName | NS:ElementName" xmlns:NS="your-namespace">
   ... output ...
</xsl:template>

(Tipicamente, a declaração do prefixo NS seria colocado no elemento de folha de estilo)

Esta é de longe a versão mais 'limpa' para mim -. Eu tenho beeen usando isso para ter um único processo de folha de estilo XSLT todos os três formatos de RSS (0.91, 1.0 e 2.0)

Eu encontrei o seguinte página para apresentar o problema muito bem, embora não dando a solução:

http://www.edankert.com/defaultnamespaces.html

E eu encontrei a solução para esse problema na O'Reilly "XML em um Nutshell":

http://docstore.mik.ua/orelly/xml/xmlnut/ ch08_10.htm

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top