XSL测试是否在for-each循环中满足自闭元素

时间:2011-12-13 20:35:15

标签: 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>
    <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>

我的问题是,我需要输入什么而不是UNKNOWN_TEST?或者也许这不是我应该尝试解决的问题?

2 个答案:

答案 0 :(得分:1)

您无法看到它是否已自动关闭,您可以测试它是否为空,无论如何它都无法正常工作,因为您的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>

答案 1 :(得分:1)

将XSLT视为处理文档的文字文本是错误的。它正在处理一个模型,一个表示,其中<page/><page></page>是等价的。但是,您对之前的答案做了如下评论:

  

每个b都是书中的一行文字。每个<page/>表示一个   页面结束,下一次开始。所以我想要每个“页面”(b s   <page/>之间的<p> s包裹在key内。我希望这可以解释它   一点点。

以下样式表使用b按其前面的page分组<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>

生成以下输出:

{{1}}