I need my output to be "DA" if any attribute is "DA", or the value of
the next attribute if any attribute is "BA" (i.e. if elem7="BA
elem8="03" I want "03" output)
There is no danger of multiple matches, so if an attribute is "BA",
there will be no "DA" attribute, but the values could occur in any
element
This single XPath expression produces the wanted value:
string(/*/@*[. = 'DA']
|
/*/@*[name()
=
concat('elem', substring-after(name(/*/@*[.='BA']), 'elem') +1)]
)
And here is the complete transformation:
<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>
As can be seen this transformation simply evaluates the XPath expression and copies the result of the evaluation to the output.
When the transformation is applied on this XML document (your 2nd case):
<SI elem1="TI"
elem2="FN"
elem3="4099450222"
elem4="TM"
elem5="4094110000"
elem6="MT"
elem7="BA"
elem8="03"
elem9="DS"
elem10="DD"
elem11="16"/>
the result is:
03
When the same transformation is applied on the originally provided XML document (your 1st case):
<SI elem1="TI"
elem2="FN"
elem3="4099450222"
elem4="TM"
elem5="4094110000"
elem6="MT"
elem7="SP"
elem8="MC"
elem9="DS"
elem10="DA"
elem11="16"/>
again the wanted, correct result is produced:
DA
Explanation:
Proper use of the XPath union operator |
, and the functions string()
, substring-after()
, name()
and `concat()
.