属性が「DA」の場合は出力を「DA」にする必要があり、属性が「BA」の場合は次の属性の値にする必要があります(つまり、elem7 = "BA elem8 ="03"の場合は"03"出力が必要です)
複数の一致の危険性はないため、属性が「BA」の場合、「DA」属性はありませんが、値はどの要素でも発生する可能性があります
この単一のXPath式は、必要な値を生成します。
string(/*/@*[. = 'DA']
|
/*/@*[name()
=
concat('elem', substring-after(name(/*/@*[.='BA']), 'elem') +1)]
)
そして、これが完全な変換です。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:copy-of select=
"string(/*/@*[. = 'DA']
|
/*/@*[name()
=
concat('elem', substring-after(name(/*/@*[.='BA']), 'elem') +1)]
)"/>
</xsl:template>
</xsl:stylesheet>
ご覧のとおり、この変換はXPath式を評価し、評価結果を出力にコピーするだけです。
このXMLドキュメントに変換が適用される場合(2番目のケース):
<SI elem1="TI"
elem2="FN"
elem3="4099450222"
elem4="TM"
elem5="4094110000"
elem6="MT"
elem7="BA"
elem8="03"
elem9="DS"
elem10="DD"
elem11="16"/>
結果は:
03
同じ変換が最初に提供されたXMLドキュメントに適用される場合(最初のケース):
<SI elem1="TI"
elem2="FN"
elem3="4099450222"
elem4="TM"
elem5="4094110000"
elem6="MT"
elem7="SP"
elem8="MC"
elem9="DS"
elem10="DA"
elem11="16"/>
再び、必要な正しい結果が生成されます:
DA
説明:
XPathユニオン演算子、および|
関数string()
、、、の適切な使用。substring-after()
name()
`concat()