/ / Removendo atributos de elementos quando eles têm um determinado valor - xslt, xsd, xslt-2.0

Removendo atributos de elementos quando eles têm um determinado valor - xslt, xsd, xslt-2.0

Eu estou escrevendo uma folha de estilos para "canonicalize" XMLesquemas, a fim de tornar mais fácil compará-los. Ele classificará elementos de nível superior por nome, atributo de ordem em uma ordem fixa, etc. Isso é o que eu tenho para atributos até agora:

<xsl:template match="xsd:attribute">
<xsl:copy>
<xsl:copy-of select="@name"/>
<xsl:copy-of select="@type"/>
<xsl:copy-of select="@ref"/>
<xsl:copy-of select="@use"/>
<xsl:copy-of select="@default"/>
<xsl:apply-templates select="@*">
<xsl:sort select="name()"/>
</xsl:apply-templates>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>

Agora eu também gostaria de remover os atributos redundantes. Por exemplo, use = "optional" deve ser abandonado, uma vez que optional é o padrão de qualquer maneira.

Então, minha pergunta é: qual seria a maneira mais fácil de melhorar o código acima, a fim de eliminar o use atributo quando o seu valor é optional?

Respostas:

0 para resposta № 1

@ JohnBollinger e @MartinHonnen corretamente apontaram que o @* condição irá inserir todos os atributos, mesmoos selecionados acima. Então a condição precisa ser refinada. Também foi apontado que, de acordo com a especificação, a ordem dos atributos não pode ser assegurada. O fato de que eles estamos ser ordenado é simplesmente um artefato de como meu processador (Saxon9-HE) funciona. Eu estou bem com isso, porém. Aqui está a solução que cheguei:

<xsl:template match="xsd:attribute">
<xsl:copy>
<xsl:copy-of select="@name" />
<xsl:copy-of select="@type" />
<xsl:copy-of select="@ref" />
<xsl:copy-of select="@use[string() != "optional"]" />
<xsl:copy-of select="@default" />
<xsl:apply-templates select="@*[name(.) != "use"]">
<xsl:sort select="name()" />
</xsl:apply-templates>
<xsl:apply-templates select="node()" />
</xsl:copy>
</xsl:template>

Eu não adicionei os outros nomes de atributos ao filtro negativo @* já que o Saxon não duplicará os atributos e os deixará na ordem exigida, mesmo que seja reinserido pelo @* cláusula. Então, isso satisfaz minhas necessidades atuais com o mínimo de esforço, mesmo que não seja uma solução genérica (que eu realmente não preciso).