Используйте это выражение XPath 2.0 :
'[',
string-join((/*/*/finishedSqFt/string(),
/*/*/bedrooms/string(),
(/*/*/bathrooms/string(), 'default')[1],
/*/*/lastSoldDate/string()), ', '),
']'
Проверка на основе XSLT 2.0
Это преобразование:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:sequence select=
"'[',
string-join((/*/*/finishedSqFt/string(),
/*/*/bedrooms/string(),
(/*/*/bathrooms/string(), 'default')[1],
/*/*/lastSoldDate/string()), ', '),
']'
"/>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленному документу XML:
<results>
<result>
<finishedSqFt>2608</finishedSqFt>
<bedrooms>3</bedrooms>
<totalRooms>9</totalRooms>
<lastSoldDate>05/25/2001</lastSoldDate>
</result>
</results>
оценивает вышеприведенное выражение XPath и выводит результат этой оценки - требуемый, правильныйрезультат :
[ 2608, 3, default, 05/25/2001 ]
II. Решение XPath 1.0
concat('[ ',
string(/*/*/finishedSqFt), ', ',
string(/*/*/bedrooms), ', ',
substring(string(/*/*/bathrooms), 1 div boolean(string(/*/*/bathrooms)) ),
substring('default', 1 div not(string(/*/*/bathrooms)) ),
', ',
string(/*/*/lastSoldDate),
' ]'
)
XSLT 1.0 - проверка на основе :
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:value-of select=
"concat('[ ',
string(/*/*/finishedSqFt), ', ',
string(/*/*/bedrooms), ', ',
substring(string(/*/*/bathrooms), 1 div boolean(string(/*/*/bathrooms)) ),
substring('default', 1 div not(string(/*/*/bathrooms)) ),
', ',
string(/*/*/lastSoldDate),
' ]'
)
"/>
</xsl:template>
</xsl:stylesheet>
при применении к тому же предоставленному документу XML, то же самое правильнополучается результат :
[ 2608, 3, default, 05/25/2001 ]
Для объяснения решения XPath 1.0 см. этот ответ