Не думаю, что contains()
- это ваша проблема.
Проблема в том, что ваш шаблон report_row имеет <xsl:param name="value"/>
, которому никогда не присваивается значение.У вас есть логика, которая основана на этом параметре, который никогда не срабатывает.Поскольку $value
пусто, оно никогда не будет contain()
,
или любым другим символом.
Вы можете получить желаемое поведение, добавив атрибут select
к xsl:param
:
<xsl:template match="report_row">
<xsl:param name="value" select="." />
Вы могли бы упростить свою таблицу стилей и логику, сделав больше стиль «push», который легче отлаживать и поддерживать, чем таблицы стилей «pull», которые пытаются реализовать процедурную логику в XSLT.* Что-то вроде следующей таблицы стилей позволяет добиться того же:
<?xml version="1.0"?>
<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:apply-templates select="*/report_header/*"/>
<xsl:apply-templates select="*/report_row/*"/>
</xsl:template>
<!-- For all but the last item, apply templates for the content, then add a comma -->
<xsl:template match="*[following-sibling::*]">
<xsl:apply-templates/>
<xsl:text>,</xsl:text>
</xsl:template>
<!-- If it's the last element in a group, add a newline char -->
<xsl:template match="*[not(following-sibling::*)]">
<xsl:apply-templates />
<!--Line break-->
<xsl:text> </xsl:text>
</xsl:template>
<!-- If any values contains a comma, wrap it in quotes -->
<xsl:template match="text()[contains(.,',')]">
<xsl:text>"</xsl:text>
<xsl:value-of select="."/>
<xsl:text>"</xsl:text>
</xsl:template>
</xsl:stylesheet>
Создает следующий вывод:
desc,prname,prnum,cdate,phase,stype,status,parent,location
,IT Project Message Validation,IT-0000021,12/14/2010 09:56 AM,Preparation,IT Projects,Active,IT,/IT/BIOMED
,"David, Michael John Morning QA Test",IT-0000020,12/14/2010 08:12 AM,Preparation,IT Projects,Active,IT,/IT/BIOMED