我有一个输入xml,如下所示:
<vtext>
<myTag>Title</myTag>
</vtext>
<vtext>
<myTag> </myTag>
</vtext>
<vtext>
<myTag> </myTag>
</vtext>
<vtext>
<myTag>Some text here maybe</myTag>
</vtext>
<vtext>
<myTag> </myTag>
</vtext>
<vtext>
<myTag> </myTag>
</vtext>
<vtext>
<myTag> </myTag>
</vtext>
<vtext>
<myTag>Other text...</myTag>
</vtext>
<vtext>
节点始终包含可能为空的单个<myTag>
子节点。 (在此示例中,它使用填充,但它也可以是
<myTag\>
我想要实现的是输出HTML如下所示:
Title<br>
<br>
Some text here maybe<br>
<br>
Other text...
基本上,我想用一个<myTag>
标签替换多个空的<br>
节点。为此,我使用了一个xsl转换,需要一个额外的条件,我现在无法想出(无法弄清楚)......
我现在所拥有的是:
<xsl:for-each select="myTag">
<xsl:choose>
<xsl:when
test="normalize-space(current()) = '' and **SOME CONDITION INVOLVING preceding-sibling MAYBE??**>
<br />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="current()" />
<br />
</xsl:otherwise>
</xsl:choose>
有关额外条件需要去哪里的任何想法?
由于
答案 0 :(得分:2)
由于myTag
是vtext
的孩子,您可能希望将xsl:for-each
更改为选择vtext
元素,而不是myTag
。此外,您可以添加一个条件,仅选择myTag
非空的,或前一个非空的
<xsl:for-each select="vtext[normalize-space(myTag) or normalize-space(preceding-sibling::vtext[1]/myTag)]">
因此,您正在同时捕获这两个条件。
试试这个XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" />
<xsl:template match="/*">
<xsl:for-each select="vtext[normalize-space(myTag) or normalize-space(preceding-sibling::vtext[1]/myTag)]">
<xsl:value-of select="normalize-space(myTag)" />
<br />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
它也可以这样做:
<xsl:template match="vtext">
<xsl:for-each select="myTag">
<xsl:choose>
<!-- If the current 'myTag' is empty and the previously one is not append an empty line -->
<xsl:when
test="string-length(normalize-space(current())) = 0
and not(string-length(normalize-space(../preceding-sibling::vtext[1]/myTag)) = 0)">
<br />
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<!-- If the current 'myTag' is not empty, add it to the existing document -->
<xsl:when test="not(string-length(normalize-space(current())) = 0)">
<xsl:value-of select="current()" />
<br />
</xsl:when>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>