【问题标题】:XSL: Split text attribute based on delimiterXSL:基于分隔符拆分文本属性
【发布时间】:2012-04-30 02:56:21
【问题描述】:

我有以下代码。

<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

测试2

测试4

测试1

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

我怎样才能做到这一点?

【问题讨论】:

  • 您使用的是 XSLT1.0 还是 XSLT2.0?在 XSLT2.0 中,有一个 'tokenize' 函数可以让这更容易。

标签: xslt


【解决方案1】:

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

二。 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 

【讨论】:

    【解决方案2】:

    条件语句列表应该适合你

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-14
        • 1970-01-01
        • 2021-12-17
        相关资源
        最近更新 更多