これは自己完結型で、外部の XML ファイルを必要としないオプションです。
この XSLT の場合:
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my"
exclude-result-prefixes="my"
version="1.0">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<my:attributeNames>
<name original="FingerOne" new="F1"/>
<name original="FingerTwo" new="F2"/>
<name original="FingerThree" new="F3"/>
</my:attributeNames>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Hand/*">
<xsl:attribute
name="{document('')/*/my:attributeNames/*
[@original = name(current())]/@new}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
...提供された XML に対して適用されます。
<Hand id="left">
<FingerOne>Thumb</FingerOne>
<FingerTwo>Pointer</FingerTwo>
<FingerThree>Middle</FingerThree>
</Hand>
...必要な結果が生成されます。
<Hand id="left" F1="Thumb" F2="Pointer" F3="Middle" />
説明:
または、別の XSLT 1.0 ソリューションを次に示します。次の場合は、より便利になる可能性があります。
document('')
何らかの理由で、あなたの環境では利用できません。
また
- XSLT で疑似辞書を使用するのは、少し手間がかかるように思えます (そして、小さな仮定を立てても構いません)。
この XSLT の場合:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vStartingChar" select="'F'" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Hand/*">
<xsl:attribute
name="{concat($vStartingChar, count(preceding-sibling::*) + 1)}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
...同じ入力 XML に対して適用すると、必要な結果が再び生成されます。
<Hand id="left" F1="Thumb" F2="Pointer" F3="Middle" />
説明:
XSLT の先頭に定義されている変数に注意してください。
<xsl:variable name="vStartingChar" select="'F'" />
これにより、新しい属性の開始文字に変更するための便利なメカニズムが提供されます。前述のように、この同じパターンが続く場合 (つまり、追加の属性が同じスキームに従う場合 - F4
、F5
など)、要素の「配列」を更新する必要がないため、このソリューションはより良い方法です。