/ / XSLT xsl: copy e xsl: for-each em atributos - java, xslt, atributos, foreach, cópia

XSLT xsl: copy e xsl: for-each em atributos - java, xslt, atributos, foreach, copy

Eu tenho o seguinte modelo xsl:

<xsl:template match="@*|node()" mode="fix-entity-references">
<xsl:copy>
<xsl:for-each select="@*">
<xsl:if test="name() = "href"">
<xsl:variable name="hrefvar">
<xsl:value-of select="current()"/>
</xsl:variable>
<xsl:attribute name="href">
anything
</xsl:attribute>
</xsl:if>
</xsl:for-each>
<xsl:apply-templates select="@*|node()" mode="fix-entity-references"/>
</xsl:copy>
</xsl:template>

Eu quero usar este modelo para copiar o atual, mas somente após o processamento de todos os seus atributos. A amostra atual é muito simples e pode ser substituída por um bloco muito simples. A expressão de teste será muito mais complexa, pois pode haver N atributos em todos os elementos que satisfazer a expressão. É por isso que para cada um é necessário. Quero processar todos esses atributos da mesma maneira. Tentei imprimir o valor "current ()", ele sempre funciona bem. O problema está em atualizar o atributo do Definir o valor do atributo "href" como "qualquer coisa" não funcionará, porque acho que, quando o chamo, ele está dentro de um bloco para cada bloco, o que significa que o nó atual é o próprio atributo.

Como devo definir o atributo do bloco original de dentro para cada bloco, para que o nó copiado use os atributos modificados?

Agradeço antecipadamente.

Respostas:

1 para resposta № 1

Ao invés de for-each e if, considere usar modelos que correspondam aos atributos que você deseja tratar de maneira diferente, por exemplo,

<xsl:template match="@*|node()" mode="fix-entity-references">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="fix-entity-references"/>
</xsl:copy>
</xsl:template>

<xsl:template match="@href | @foo | @bar" mode="fix-entity-references">
<xsl:attribute name="{name()}">
<xsl:value-of select=".."/>
</xsl:attribute>
</xsl:template>

No modelo de dados XPath, os nós do atributo não são considerados filhos do elemento, mas o pai de um nó do atributo é o elemento ao qual o atributo pertence (ou seja, quando o nó de contexto é um atributo, .. é o elemento no qual o atributo pode ser encontrado). Portanto, esta amostra substituirá o valor de qualquer href, foo ou bar atributo com o conteúdo de texto do elemento que contém o atributo, ou seja,

<a href="#">http://example.com</a>

se tornaria

<a href="http://example.com">http://example.com</a>