XML de saída XSL sem prefixo sem usar o namespace padrão?
Eu tenho um XSL onde eu preciso gerar saída ao longo das linhas deste:
<moo xmlns="http://api.example.com">
<foo>1358944586848</foo>
<bar>
<a>1</a>
<b>2</b>
<c>3</c>
</bar>
</moo>
Eu poderia fazer assim:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://api.example.com">
<xsl:template match="/">
<xsl:element name="moo">
<!-- and so on -->
No entanto, eu meio que odeio usar o prefixo xsl em meus arquivos xsl porque eu sinto que ele fica muito confuso. Selecionando com XPath é fácil de qualquer maneira, desde que você pode definirxpath-default-namespace
para o que você está transformando, se necessário. Mas não háelement-default-namespace
disponível, tanto quanto eu posso ver, então como posso gerar a saída desejada em um bom caminho?
Eu sei que posso fazer isso:
<stylesheet version="2.0"
xmlns="http://www.w3.org/1999/XSL/Transform">
<template match="/">
<element name="moo" namespace="http://api.example.com">
<!-- and so on -->
Mas então eu tenho que definir este namespace explicitamente em cada elemento que eu criar, ou eles vão acabar com o namespace XSL. Existe uma maneira limpa de criar elementos com um determinado namespace (sem prefixo) e não tocar no namespace padrão do arquivo xsl?
Atualizar:
Figurou talveznamespace-alias
poderia fazer alguma coisa, mas não consegue descobrir como usá-lo. Tentei isso, mas não parece fazer nenhuma diferença na saída:
<stylesheet version="2.0"
xmlns="http://www.w3.org/1999/XSL/Transform"
xmlns:out="http://api.example.com">
<namespace-alias stylesheet-prefix="out" result-prefix=""/>
<template match="/">
<element name="out:moo">
<!-- and so on -->
onamespace-alias
coisa provavelmente não está fazendo o que eu acho que é: p
A solução final que usei, com base na resposta de JLRishe
remove-prefixos.xsl
<?xml version="1.0" encoding="UTF-8"?>
<stylesheet version="2.0" xmlns="http://www.w3.org/1999/XSL/Transform">
<template match="/">
<variable name="result">
<next-match />
</variable>
<apply-templates select="$result" mode="remove-prefixes" />
</template>
<template match="*" priority="1" mode="remove-prefixes">
<element name="{local-name()}" namespace="{namespace-uri()}">
<apply-templates select="@* | node()" mode="remove-prefixes" />
</element>
</template>
<template match="@*|node()" mode="remove-prefixes">
<copy>
<apply-templates select="@* | node()" mode="remove-prefixes" />
</copy>
</template>
</stylesheet>
subject.xsl
<!-- snip -->
<import href="remove-prefixes.xsl" />
<!-- snip -->