Не используйте local-name()
.Объявите пространства имен в вашем XSLT и используйте префиксы.
Например, объявите их так (вы можете выбрать любые префиксы, которые вам нравятся, если совпадают URI пространства имен):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msg="http://www.caps-solutions.co.uk/webservices/connectors/731/servicerequest/messagetypes"
xmlns:sr="http://www.caps-solutions.co.uk/schema/uniform/731/servicerequest/sr/srtypes"
xmlns:uni="http://www.caps-solutions.co.uk/schema/uniform/72b/common/uniformtypes"
exclude-result-prefixes="msg sr uni"
>
И используйте (обернуто для удобочитаемости, но XPath не чувствителен к пробелам, вы можете обернуть его таким же образом в вашем XSLT):
/msg:GetGeneralServiceRequestByReferenceValueResponse
/sr:GeneralServiceRequest
/sr:ServiceRequestIdentification
/sr:AlternativeReferences
/uni:AlternativeReference[uni:ReferenceType = 'UTRN']
/uni:ReferenceValue
Здесь /uni:AlternativeReference[uni:ReferenceType = 'UTRN']
выбирает только те <AlternativeReference>
узлы, которыеиметь <ReferenceType>
дочерний элемент для требуемого значения.
Поскольку существует много способов взглянуть на дерево XML (и потому что я думаю, что это явно. именование. каждый. один. шаг. вдоль.переборщил), что-то вроде этого также будет работать:
//uni:ReferenceType[. = 'UTRN']/../uni:ReferenceValue
или
//uni:AlternativeReference[uni:ReferenceType = 'UTRN']/uni:ReferenceValue