我在一年多的时间里没有练过XML。 我的问题是,使用下面的示例,为什么我的for-each语句只打印第一段。
如果您想知道为什么我的XML使用标准的HTML“p”标签,我试图将其放回到我的XSL文件中的“p”标签中:原因是我正在批量处理来自a的多个长写入器文档将处理器转换成HTML文件。有数千(可能是数万)的段落标签。我无法以任何我可以使用的格式输出XML文件或操纵我想要的方式。
但是,我可以使用XML扩展名保存HTML文件并使用它。我已经转换了一些其他文件,但尚未尝试使用
标签。
我的XML文件
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="example.xsl"?>
<Library>
<Books>
<MyBooks>
<my_favorite_book>
<title>the title of my favorite book</title>
<p>paragraph 1</p>
<p>paragraph 2</p>
<p>paragraph 3</p>
<p>paragraph 4</p>
<p>paragraph 5</p>
<p>paragraph 6</p>
<p>paragraph 7</p>
<p>paragraph 8</p>
<p>paragraph 9</p>
</my_favorite_book>
</MyBooks>
</Books>
</Library>
我的XSL文件
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<html>
<body>
<p align="center">
<span style="font-size: 5em;">
<b>
<xsl:value-of select="Library/Books/MyBooks/my_favorite_book/title" />
</b>
</span>
<br/>
</p>
<xsl:for-each select="Library/Books/MyBooks/my_favorite_book">
<p>
<xsl:value-of select="p" />
</p>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Web浏览器输出(FireFox 54.0.1(32位))
答案 0 :(得分:2)
我的问题是,使用下面的示例,为什么我的for-each语句是 只打印第一段。
因为您的for-each
,
<xsl:for-each select="Library/Books/MyBooks/my_favorite_book">
仅选择my_favorite_book
和xsl:value-of
,
<xsl:value-of select="p" />
选择所有my_favority_book
个孩子只取第一个p
的字符串值,
paragraph 1
对程序的最短修复是遍历段落,
<xsl:for-each select="Library/Books/MyBooks/my_favorite_book/p">
并取每个值,
<xsl:value-of select="." />
或者,您可以使用xsl:for-each
而不是使用apply-templates
进行循环:
<xsl:apply-templates select="Library/Books/MyBooks/my_favorite_book/p">
如果你要进行进一步的模式匹配,或者copy-of
如果你没有:
<xsl:copy-of select="Library/Books/MyBooks/my_favorite_book/p">
答案 1 :(得分:0)
我在另一个有效的Stack Overflow帖子中发现了答案。
即将上述代码更改为以下代码:
<xsl:for-each select="Library/Books/MyBooks/my_favorite_book/p">
<p>
<xsl:value-of select="." />
</p>
</xsl:for-each>
另外,在查看我做过的其他一些项目,并在这里阅读其他帖子时,我现在回想一下,使用“模板”方法产生了更平滑,更灵活的结果,所以我明天会彻底修改我的XSL文件。在这里留下更新。