这是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?或者也许这不是我应该尝试解决的问题?
答案 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}}