XSL: разделить текстовый атрибут на основе разделителя

У меня есть следующий код.

<xsl:template match="Rel/SPFMarkupFile">
<xsl:for-each select="./SPFReportItem">
    <tr>
        <td>X</td>
        <td><xsl:value-of select='../../../SPFReportItem/ReportAttribute[@AttrName="Name"]/@AttrValue' /></td>
        <td colspan="4" indent="yes">
            <xsl:value-of select='ReportAttribute[@AttrName="SPFMarkupText"]/@AttrValue' />
        </td>   
        <td><xsl:value-of select='ReportAttribute[@AttrName="CreationUser"]/@AttrValue' /></td>
        <td colspan="2">N/A</td>
        <td><xsl:value-of select='ReportAttribute[@AttrName="SPFMarkupType"]/@AttrValue' /></td>
    </tr>
</xsl:for-each>

For <xsl:value-of select='ReportAttribute[@AttrName="SPFMarkupText"]/@AttrValue' />

Например, значение может быть test123~test2~test4~test1 Разделитель ~

Я хочу разделить это значение и поместить его в разные строки. Поэтому я хочу, чтобы это было похоже на

тест123

тест2

тест4

тест1

Для других столбцов это будут те же значения.

Как я могу этого добиться?


person Daniel Sim    schedule 30.04.2012    source источник
comment
Вы используете XSLT1.0 или XSLT2.0? В XSLT2.0 есть функция "разметки", которая упростит эту задачу.   -  person Tim C    schedule 30.04.2012


Ответы (3)


Например, значение может быть test123~test2~test4~test1 Разделитель ~

Я хочу разделить это значение и поместить его в разные строки.

Использование:

translate(., '~', '&#xA;')

Вычисление этого выражения XPath создает из строкового значения текущего узла другую строку, в которой каждое вхождение символа ~ заменяется символом NL (новая строка).

Демо:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/*">
     <xsl:value-of select="translate(., '~', '&#xA;')"/>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к данному XML-документу:

<t>test123~test2~test4~test1 </t>

получен желаемый правильный результат:

test123
test2
test4
test1 

II. Решение XSLT 2.0:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/*">
     <xsl:value-of select="tokenize(., '~')" separator="&#xA;"/>
 </xsl:template>
</xsl:stylesheet>

При применении к тому же XML-документу (см. выше) создается желаемый правильный результат:

test123
test2
test4
test1 
person Dimitre Novatchev    schedule 30.04.2012

Список условных операторов должен работать на вас

<xsl:if test="'ReportAttribute[@AttrName="SPFMarkupText"]/@AttrValue'='Test123'">
</xsl:if>
<xsl:if test="'ReportAttribute[@AttrName="SPFMarkupText"]/@AttrValue'='Test1'">
</xsl:if>
<xsl:if test="'ReportAttribute[@AttrName="SPFMarkupText"]/@AttrValue'='Test2'">
</xsl:if>
<xsl:if test="'ReportAttribute[@AttrName="SPFMarkupText"]/@AttrValue'='Test3'">
</xsl:if>
person Kickaha    schedule 30.04.2012

Разделите значение на части с помощью функции tokenize в XSLT 2.0 или используйте очень хороший ответ Мартина Хоннена на один из моих собственных вопросов при использовании XSLT 1.0: Как заставить функцию расширения XSLT Javascript возвращать набор узлов?.

person Maestro13    schedule 30.04.2012