获取XSLT中的前3项

时间:2017-03-20 15:58:08

标签: xml xslt xpath openxml

我现在正在做一个项目并将word文档转换为html文档。

我在这里添加了一小部分XML文件,这个文件将以HTML格式查看。

<w:p w:rsidR="001207E2" w:rsidRPr="001509B0" w:rsidRDefault="001207E2" w:rsidP="004E414C">
        <w:pPr>
            <w:pStyle w:val="AppBody-Description"/>
            <w:numPr>
                <w:ilvl w:val="1"/>
                <w:numId w:val="5"/>
            </w:numPr>
        </w:pPr>
        <w:r w:rsidRPr="001509B0">
            <w:t>First Item</w:t>
        </w:r>
    </w:p>
    <w:p w:rsidR="00AD36E6" w:rsidRPr="001509B0" w:rsidRDefault="00AD36E6" w:rsidP="004E414C">
        <w:pPr>
            <w:pStyle w:val="AppBody-Description"/>
            <w:numPr>
                <w:ilvl w:val="1"/>
                <w:numId w:val="5"/>
            </w:numPr>
        </w:pPr>
        <w:r w:rsidRPr="001509B0">
            <w:t>Second Item</w:t>
        </w:r>
    </w:p>
    <w:p w:rsidR="00AD36E6" w:rsidRPr="001509B0" w:rsidRDefault="00AD36E6" w:rsidP="004E414C">
        <w:pPr>
            <w:pStyle w:val="AppBody-Description"/>
            <w:numPr>
                <w:ilvl w:val="1"/>
                <w:numId w:val="5"/>
            </w:numPr>
        </w:pPr>
        <w:r w:rsidRPr="001509B0">
            <w:t>Third Item</w:t>
        </w:r>
    </w:p>

所以,这是我尝试使用的XSLT代码

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 wp14">
<xsl:output method="html" doctype-system="about:legacy-compat"/>
<xsl:template match="/">
    <html>
        <head>
            <title/>
        </head>
        <body>
            <xsl:for-each select="w:document/w:body/w:p">
                <xsl:if test="w:pPr/w:numPr/w:ilvl[@w:val='1']">
                        <ol>
                            <li>    <xsl:for-each select="w:r/w:t[position()&lt;3]">
                                    <xsl:value-of select="."/>
                                    </xsl:for-each>
                            </li>
                        </ol>
                </xsl:if>
            </xsl:for-each>
        </body>
    </html>
</xsl:template>

这是该代码的结果

<!DOCTYPE HTML SYSTEM "about:legacy-compat"><html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title></title>
</head>
<body>
    <ol>
        <li>First Item</li>
    </ol>
    <ol>
        <li>Second Item</li>
    </ol>
    <ol>
        <li>Third Item</li>
    </ol>
    <ol>
        <li>Fourth Item</li>
    </ol>
</body>

好的问题是我不想在列表中选择第4个元素。我只想获得前3个元素。

但它不起作用。

我是XSLT的新手所以,基本上我无法看到问题。我检查了几个来源,这对我来说似乎很合乎逻辑。

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

您的所有w:t[position() &lt; 3]谓词都会通过,因为所有w:t元素都位于各自w:r元素的第1位。

测试祖先w:p元素的位置:

更改

        <xsl:for-each select="w:document/w:body/w:p">

        <xsl:for-each select="w:document/w:body/w:p[position() &lt; 3]">

根据您的实际XML和要求,您可能还希望将w:pPr/w:numPr/w:ilvl[@w:val='1']测试合并到xsl:for-each/@select测试中。