/ / XSLT xsl: kopírovať a xsl: pre každý z atribútov - java, xslt, atribúty, foreach, copy

XSLT xsl: copy a xsl: pre atribúty - java, xslt, atribúty, foreach, copy

Mám nasledujúcu šablónu 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>

Chcem použiť túto šablónu na kopírovanie aktuálnehouzol, ale len po spracovaní všetkých jeho atribútov.Táto vzorka je veľmi jednoduchá a mohla by byť nahradená veľmi jednoduchým blokom.Testovaný výraz bude oveľa zložitejším je to, že môže mať N atribúty na každý prvok, ktorý uspokojiť výraz.To je dôvod, prečo-každý z nich je potrebné.Chcem spracovať všetky tieto atribúty rovnakým spôsobom.Snažil som sa vytlačiť "aktuálne ()" hodnota to vždy funguje dobre.Problém je s aktualizáciou atribútu pôvodný uzol.Nastavenie hodnoty atribútu "href" na "čokoľvek" nebude fungovať, pretože hneď ako to nazývam, je to v bloku pre každý blok, čo znamená, že aktuálny uzol je vlastný atribút.

Ako by som mal nastaviť atribút pôvodného bloku z vnútra pre každý blok tak, aby kopírovaný uzol používal modifikované atribúty?

Vopred ďakujem.

odpovede:

1 pre odpoveď č. 1

Radšej než for-each a if, môžete zvážiť použitie šablón, ktoré zodpovedajú atribútom, s ktorými chcete zaobchádzať inak, napr.

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

V atribútoch atribútov údajov modelu XPath sa uzly nepovažujú za deti elementu, ale rodiča uzla atribútu je prvok, ku ktorému tento atribút patrí (to znamená, keď kontextový uzol je atribút, .. je prvok, na ktorom sa môže nájsť atribút). Takto by táto vzorka nahradila hodnotu akéhokoľvek href, foo alebo bar atribút s textovým obsahom elementu obsahujúceho atribút, t.j.

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

by sa stal

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