2012-06-26 2 views
2

Источник:Разделить значения тега с XSLT

<Data> 
    <value>M1,M2,M3,M4,M5,M6</value> 
    </Data> 

нужно отображать их как

Выход:

<ABCD> 
     <value1>M1</value1> 
     <value2>M2</value2> 
     <value3>M3</value3> 
     <value4>M4</value4> 
     <value5>M5</value5> 
     <value6>M6</value6> 
    </ABCD> 

XSLT:

Я на самом деле хочу, чтобы расколоть значение на основе «,» и поместить их в разные переменные. Использование str-split(), Могу ли я загрузить его в разные переменные.

ответ

3

Это XSLT-преобразование 1.0:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/*"> 
    <ABCD> 
    <xsl:apply-templates/> 
    </ABCD> 
</xsl:template> 

<xsl:template match="value/text()" name="split"> 
    <xsl:param name="pText" select="."/> 
    <xsl:param name="pOrd" select="1"/> 

    <xsl:if test="$pText"> 
    <xsl:element name="value{$pOrd}"> 
     <xsl:value-of select= 
     "substring-before(concat($pText, ','), ',')"/> 
    </xsl:element> 

    <xsl:call-template name="split"> 
     <xsl:with-param name="pText" select="substring-after($pText, ',')"/> 
     <xsl:with-param name="pOrd" select="$pOrd+1"/> 
    </xsl:call-template> 
    </xsl:if> 
</xsl:template> 
</xsl:stylesheet> 

при нанесении на прилагаемом документе XML:

<Data> 
    <value>M1,M2,M3,M4,M5,M6</value> 
</Data> 

производит разыскиваемый, правильный результат:

<ABCD> 
    <value1>M1</value1> 
    <value2>M2</value2> 
    <value3>M3</value3> 
    <value4>M4</value4> 
    <value5>M5</value5> 
    <value6>M6</value6> 
</ABCD> 

Пояснения:

  1. рекурсивных именованный шаблон с стопами-состоянием, когда пропущенный текст-параметр становится пустой строкой.

  2. Правильное использование xsl:element и AVT.

  3. Правильное использование стандартных функций XPath substring-before() и substring-after

  4. Правильное использование sentinel упростить код и сделать его более эффективным.

+0

Благодарим за ответ – Patan

+0

@ User222: Добро пожаловать. –

0

Если у вас есть доступ к EXSLT, вы можете использовать str:split().

<xsl:apply-templates select='str:split(/Data/value, ",")' /> 

Runnable example here

Смежные вопросы