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 № 1Ao 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>