检查不同节点之间是否有文本

时间:2015-01-08 12:38:16

标签: xml xslt

我想检查不同节点之间是否有文字。

XML:

<text>
 Line1<newLine></newLine>
 Line2<newLine></newLine>
 Line3<newLine></newLine><newLine></newLine>
 Line4<newLine></newLine><newLine></newLine>
 Line5<newLine></newLine><newLine></newLine><newLine></newLine>
 Line6<newLine></newLine>
 Line7<newLine></newLine><newLine></newLine><newLine></newLine><newLine></newLine>
</text>

我目前的XSLT如下:

<xsl:template match="newLine">
 <br></br>
</xsl:template>

我当前的输出如下(忽略最后的。):

Line1
Line2
Line3

Line4

Line5


Line6
Line7



.

我想接受newLine作为标记,我希望它将其翻译为br,但我不想这样做超过两次{{} 1}}。所以我想接受一个空洞的规则,但不能超过一个。 除此之外,我也不想在输出的末尾有一个或多个空规则。因此,在Line7之后,什么都不会发生。

修改
为了更清楚一点:如果有<newLine></newLine>,或者甚至更多,我希望最多有2个<newLine></newLine><newLine></newLine><newLine></newLine>元素

我该怎么做?

2 个答案:

答案 0 :(得分:1)

如果我们限制匹配

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="newLine[following-sibling::node()[1][normalize-space()]] | 
                     newLine[following-sibling::node()[1][self::newLine[following-sibling::node()[1][normalize-space()]]]]">
  <br/>
</xsl:template>

</xsl:stylesheet>

然后输入

<text>
 Line1<newLine></newLine>
 Line2<newLine></newLine>
 Line3<newLine></newLine><newLine></newLine>
 Line4<newLine></newLine><newLine></newLine>
 Line5<newLine></newLine><newLine></newLine><newLine></newLine>
 Line6<newLine></newLine>
 Line7<newLine></newLine><newLine></newLine><newLine></newLine><newLine></newLine>
</text>

结果是

 Line1<br/>
 Line2<br/>
 Line3<br/><br/>
 Line4<br/><br/>
 Line5<br/><br/>
 Line6<br/>
 Line7

答案 1 :(得分:0)

尝试:

XSLT 1.0

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

<xsl:template match="text">
    <xsl:apply-templates select="text()"/>
</xsl:template>

<xsl:template match="text()">
    <xsl:copy-of select="."/>
    <xsl:if test="following-sibling::text()">
        <xsl:apply-templates select="following-sibling::newLine[1]"/>
    </xsl:if>
</xsl:template>

<xsl:template match="newLine" >
    <br/>
    <xsl:if test="following-sibling::node()[1][self::newLine]">
        <br/>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>