如何使用xslt

时间:2017-07-08 03:18:11

标签: xml xslt

我在一年多的时间里没有练过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位))

enter image description here

2 个答案:

答案 0 :(得分:2)

  

我的问题是,使用下面的示例,为什么我的for-each语句是   只打印第一段。

因为您的for-each

<xsl:for-each select="Library/Books/MyBooks/my_favorite_book">

仅选择my_favorite_bookxsl: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文件。在这里留下更新。