取消标记并将逗号放在期望单个标记之间

时间:2015-09-16 07:28:55

标签: xslt xslt-2.0

根据要求,我们需要用逗号分隔para的内容。我们能够做到这一点。 但是不应该考虑thiru Tag for comma它必须附加到以前的标签或下一个标签。 如果只有para在之前和之后,那么它应该附加两者。

见下面的例子:

输入4:

<Para>Apple1
    <Thiru>Mango1<Ref>Grape1</Ref><Ref>Grape2</Ref><Ref>Grape3</Ref>Mango2</Thiru>Apple2
</Para>

输出4:

<Para>Apple1Mango1,Grape1,Grape2,Grape3Mango2,Apple2</Para>

当前xsl:

<xsl:copy-of select="$Cells/Para/@*" />
<xsl:for-each select="$Cells/Para/node()[self::text() or self::Ref or self::Thiru][normalize-space(.)!='']">
<xsl:value-of select="normalize-space(.)" />
<xsl:if test="position()!=last()" >
<xsl:value-of select="','" />
</xsl:if>
</xsl:for-each>

通过使用当前的xsl,我们得到了所有元素。我的要求是我们不应该考虑Tag Thiru。

请验证样本输入和输出。

1 个答案:

答案 0 :(得分:2)

查看您当前的输入和预期输出,我假设以下规则

  1. 不要在第一个文本元素之前放置逗号
  2. 不要在父文件为Thiru
  3. 的文本元素前放置逗号

    在这种情况下,请尝试这个样式表:(注意我已经颠倒了逻辑,所以它实际上是在检查是否应该放置逗号,而不是放置它)

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:output method="xml" indent="yes" />
    
        <xsl:template match="Para">
            <xsl:copy>
                <xsl:apply-templates select="@*"/>
                <xsl:for-each select=".//text()">
                    <xsl:if test="position() > 1 and not(parent::Thiru)">,</xsl:if>
                    <xsl:value-of select="normalize-space()" />
                </xsl:for-each>
            </xsl:copy>
        </xsl:template>
    
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
    </xsl:stylesheet>
    

    当这应用于以下输入时:

    <Para>Apple1
        <Thiru>Mango1<Ref>Grape1</Ref><Ref>Grape2</Ref><Ref>Grape3</Ref>Mango2</Thiru>Apple2
    </Para>
    

    以下是输出

    <Para>Apple1Mango1,Grape1,Grape2,Grape3Mango2,Apple2</Para>