根据要求,我们需要用逗号分隔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。
请验证样本输入和输出。
答案 0 :(得分:2)
查看您当前的输入和预期输出,我假设以下规则
Thiru
在这种情况下,请尝试这个样式表:(注意我已经颠倒了逻辑,所以它实际上是在检查是否应该放置逗号,而不是放置它)
<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>