Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt XSL测试每个循环是否满足自关闭元素_Xslt_If Statement_Foreach - Fatal编程技术网

Xslt XSL测试每个循环是否满足自关闭元素

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>

以下是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>
    <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答案,如果没有其他问题,我将接受。现在对我来说很复杂。。。