Xslt XSL测试每个循环是否满足自关闭元素
以下是xml示例:Xslt XSL测试每个循环是否满足自关闭元素,xslt,if-statement,foreach,Xslt,If Statement,Foreach,以下是xml示例: <a> <b>Text</b> <b>Text</b> <b>Text</b> <page/> <b>Text</b> <b>Text</b> <page/> <b>Text</b> <b>Text</b>
<a>
<b>Text</b>
<b>Text</b>
<b>Text</b>
<page/>
<b>Text</b>
<b>Text</b>
<page/>
<b>Text</b>
<b>Text</b>
<b>Text</b>
<b>Text</b>
</a>
正文
正文
正文
正文
正文
正文
正文
正文
正文
下面是我想要实现的html:
<p>Text Text Text</p>
<p>Text Text</p>
<p>Text Text Text Text</p>
文本
文本
文本文本文本文本
这是我第一次使用XSL,所以请原谅我
现在我正在使用这个循环:
<xsl:for-each select="a/*">
<p>
<xsl:value-of select="."/>
<xsl:if test="UNKNOWN_TEST">
</p>
</xsl:if>
</xsl:for-each>
我的问题是,我需要输入什么来代替未知的测试?或者这不是我应该尝试解决的方法?你看不到它是否是自关闭的,你可以测试它是否为空,它无论如何都不会工作,因为你的
xsl
格式不好
可能的(并非真正令人满意的)解决方案:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="/a/b[name(preceding-sibling::*[1])!='b']">
<p>
<xsl:value-of select="text()"/>
<xsl:variable name="pp" select="generate-id(preceding-sibling::page[1])" />
<xsl:variable name="fp" select="generate-id(following-sibling::page[1])" />
<xsl:for-each select="following-sibling::b[generate-id(preceding-sibling::page[1])=$pp and generate-id(following-sibling::page[1])=$fp]">
<xsl:value-of select="concat(' ',./text())"/>
</xsl:for-each>
</p>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
将XSLT视为处理文档的文本是错误的。它正在处理一个模型,一个表示法,
和
是等价的。但是,您对之前的回答发表了以下评论:
每个
b
都是一本书中的一行文本。每个
都意味着一个
页面结束,下一页开始。所以我想要每一页(b
s
在
s)之间,包装在
内。我希望这能解释一个问题
一点点
下面的样式表使用一个键
按前面的页面
对b
元素进行分组:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:key name="byPage" match="b"
use="generate-id(preceding-sibling::page[1])"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="a">
<xsl:copy>
<!-- handle the first group of b's with no preceding page -->
<p><xsl:apply-templates select="key('byPage', '')"/></p>
<xsl:apply-templates select="@*|page"/>
</xsl:copy>
</xsl:template>
<xsl:template match="page">
<p><xsl:apply-templates select="key('byPage', generate-id())"/></p>
</xsl:template>
</xsl:stylesheet>
产生以下输出:
<a>
<p>
<b>Text</b>
<b>Text</b>
<b>Text</b>
</p>
<p>
<b>Text</b>
<b>Text</b>
</p>
<p>
<b>Text</b>
<b>Text</b>
<b>Text</b>
<b>Text</b>
</p>
</a>
正文
正文
正文
正文
正文
正文
正文
正文
正文
是的,我刚刚注意到我用每个b
元素打开了p
标记。你能告诉我该怎么做吗?我不知道你到底想做什么。例如,您可以为没有前面的b
的每个b
选择所有连续的b
s。或者中间没有页面的b
s…每个b
都是一本书中的一行文本。每个
都意味着一页结束,下一页开始。所以我想把中的每一个“页面”(b
s)都包装在中。我希望这能解释一点。对不起,我的英语糟透了。。。这有点棘手,我会尽力为你想出一些尴尬的解决办法。。。我怀疑它是否完美,但这就是我想到的,等一下,我会把它编辑成答案。谢谢你,迈克尔。我将阅读您的答案和@lwburk答案,如果没有其他问题,我将接受。现在对我来说很复杂。。。