检查不同节点之间是否有文本
Check if there text between different nodes
我想检查不同节点之间是否有文本。
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
,但我不想在出现两次以上时这样做 <newLine></newLine>
.所以我想接受一个空规则,但不能超过一个。
除此之外,我也不想在输出的末尾有一个或多个空规则。所以在Line7之后,可能什么都不会发生。
编辑:
为了更清楚一点:如果有 <newLine></newLine><newLine></newLine><newLine></newLine>
,或者更多,我希望最多有 2 <br/>
个元素
我该怎么做?
如果我们将匹配限制在
<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
尝试:
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>
我想检查不同节点之间是否有文本。
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
,但我不想在出现两次以上时这样做 <newLine></newLine>
.所以我想接受一个空规则,但不能超过一个。
除此之外,我也不想在输出的末尾有一个或多个空规则。所以在Line7之后,可能什么都不会发生。
编辑:
为了更清楚一点:如果有 <newLine></newLine><newLine></newLine><newLine></newLine>
,或者更多,我希望最多有 2 <br/>
个元素
我该怎么做?
如果我们将匹配限制在
<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
尝试:
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>