/ / XSLT xsl: copy e xsl: for-each su attributi - java, xslt, attributi, foreach, copy

XSLT xsl: copy e xsl: for-each sugli attributi - java, xslt, attributi, foreach, copia

Ho il seguente modello 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>

Voglio usare questo modello per copiare la correntenodo, ma solo dopo aver elaborato tutti gli attributi di esso. Il campione corrente è molto semplice e potrebbe essere sostituito con un blocco molto semplice. L'espressione di test sarà molto più complessa, il punto è che ci possono essere N attributi su ogni elemento che soddisfare l'espressione. Ecco perché per ognuno è necessario. Voglio elaborare tutti questi attributi allo stesso modo. Ho provato a stampare il valore "current ()" che funziona sempre bene. Il problema è con l'aggiornamento dell'attributo del nodo originale L'impostazione del valore dell'attributo "href" su "nulla" non funzionerà, perché immagino che quando lo chiamo, è all'interno di un blocco per ogni che significa che il nodo corrente è l'attributo stesso.

Come devo impostare l'attributo del blocco originale dall'interno di ciascun blocco, in modo che il nodo copiato utilizzi gli attributi modificati?

Grazie in anticipo.

risposte:

1 per risposta № 1

Piuttosto che for-each e if, potresti prendere in considerazione l'utilizzo di modelli che corrispondono agli attributi che desideri trattare in modo diverso, ad es.

<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>

Nel modello di dati XPath i nodi di attributo non sono considerati elementi secondari dell'elemento, ma il padre di un nodo di attributo è l'elemento a cui appartiene l'attributo (ovvero quando il nodo di contesto è un attributo, .. è l'elemento su cui è possibile trovare l'attributo). Pertanto, questo campione sostituirà il valore di any href, foo o bar attributo con il contenuto testuale dell'elemento contenente l'attributo, ad es.

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

potrebbe diventare

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