xslt
2012-04-30 4 views 2 likes 
2

У меня есть следующий код.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> 

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

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

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

test123

test2

test4

test1

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

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

+0

Вы используете XSLT1.0 или XSLT2.0? В XSLT2.0 есть функция «tokenize», которая упростит это. –

ответ

0

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

<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> 
0

Разделить значение на часть, используя разметить функцию в XSLT 2.0 или использовать очень хороший ответ на Мартине Honnen к одному из моих собственных вопросов при использовании XSLT 1.0: How can make an XSLT Javascript extension function return a node-set?.

2

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

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

Применение:

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

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

Demo:

<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 
Смежные вопросы