XSL:基于分隔符拆分文本属性

时间:2012-04-30 02:56:22

标签: xslt

我有以下代码。

<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

对于其他列,它将是相同的值。

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:2)

  

例如,值可以是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 

答案 1 :(得分: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>

答案 2 :(得分:0)

使用XSLT 2.0中的tokenize函数将值拆分为多个部分,或者在使用XSLT 1.0时使用Martin Honnen的一个非常好的答案:How can make an XSLT Javascript extension function return a node-set?