Самое короткое / простое XSLT-преобразование, которое приводит к желаемому результату (объединение строковых значений элементов Answer
) это :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
При применении к предоставленному документу XML :
<Result>
<Answer questionId="Servicios">Auditoría|Asesoría en Impuestos|</Answer>
<Answer questionId="Servicios">Auditoría|Outsourcing|Asesoría en RRHH|</Answer>
</Result>
точно желаемый, правильный результат получается :
Auditoría|Asesoría en Impuestos|Auditoría|Outsourcing|Asesoría en RRHH|
Объяснение
Строковое значение корневого узла /
является объединением всех его потомков текстовых узлов.
Директива <xsl:strip-space elements="*"/>
удаляет из документа XML все нежелательные текстовые узлы только для пробелов.
Обновление : Если документ XML более сложный, чем предоставленный, и требуется некоторая фильтрация, вот общее и простое решение, использующее ту же идею:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vStrings">
<xsl:copy-of select="/*/*[@questionId='Servicios']"/>
</xsl:variable>
<xsl:template match="/">
<xsl:value-of select="$vStrings"/>
</xsl:template>
</xsl:stylesheet>
при применении к этому XML-документу (обратите внимание, что мы должны исключить второй <Answer>
):
<Result>
<Answer questionId="Servicios">Auditoría|Asesoría en Impuestos|</Answer>
<Answer questionId="X">Auditoría|Outsourcing|Asesoría en RRHH|</Answer>
<Answer questionId="Servicios">Auditoría|Outsourcing|Asesoría en RRHH|</Answer>
</Result>
снова желаемый, правильный результат:
Auditoría|Asesoría en Impuestos|Auditoría|Outsourcing|Asesoría en RRHH|