在另一个xsl中使用一个

时间:2018-03-29 16:12:09

标签: xml xslt transformation

我遇到XSL转换问题。我将使用xml文件发送包含标题的文档,因此,我需要在另一个文件中使用for-each来创建任何级别的标题的章节列表,但它不起作用。谢谢你的帮助。

XML

<Chapters>
    <Chapter>
        <Heading1Lvl>
            <Heading1LvlName>heading1nameFirst</Heading1LvlName>
            <Heading2Lvl>
                <Heading2LvlName>heading2name</Heading2LvlName>
                <Text typeOfText="basic">BasicText</Text>
                <Text typeOfText="important">Important</Text>
                <Text typeOfText="link">Link</Text>
            </Heading2Lvl>
        </Heading1Lvl>
    </Chapter>
    <Chapter>
        <Heading1Lvl>
            <Heding1LvlName>heading1nameSecond</Heding1LvlName>
            <Heading2Lvl>
                <Heading2LvlName>heading2nameSecond</Heading2LvlName>
                <Heading3Lvl>
                    <Heading3LvlName>Heading3First</Heading3LvlName>
                    <Text typeOfText="basic">BasicText1</Text>
                    <Text typeOfText="important">Important1</Text>
                    <Text typeOfText="link">Link1</Text>
                </Heading3Lvl>
                <Heading3Lvl>
                    <Heading3LvlName>Heading3second</Heading3LvlName>
                    <Text typeOfText="basic">BasicText2</Text>
                    <Text typeOfText="important">Important2</Text>
                    <Text typeOfText="link">Link2</Text>
                </Heading3Lvl>
                <Heading3Lvl>
                    <Heading3LvlName>Heading3third</Heading3LvlName>
                    <Text typeOfText="basic">BasicText3</Text>
                    <Text typeOfText="important">Important3</Text>
                    <Text typeOfText="link">Link3</Text>
                </Heading3Lvl>
                <Text typeOfText="basic">BasicText</Text>
                <Text typeOfText="important">Important</Text>
                <Text typeOfText="link">Link</Text>
            </Heading2Lvl>
        </Heading1Lvl>
    </Chapter>
</Chapters>

XSL

<xsl:template match="Chapters">
<div style="padding-top:10%">
    <xsl:for-each select="Chapter/Heading1Lvl">
        <xsl:value-of select="Heading1LvlName"/>
        <xsl:for-each select="Heading1Lvl/Heading2Lvl">
            <xsl:value-of select="Heading1LvlName"/>
            <xsl:for-each select="Heading2/Heading3Lvl">
                <xsl:value-of select="Heading3LvlName"/>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:for-each>
</div>

1 个答案:

答案 0 :(得分:0)

您的代码中存在多个错误:

  1. 在XML中,第二个Heading1LvlName被错误地命名为Heding1LvlName
  2. 在当前节点for-each的第一个Heading1Lvl正文中的XSLT中,您尝试使用Heading1Lvl/Heading2Lvl再次选择它,因此请删除双精度。
  3. 在第二个for-each的正文中,您当前的节点为Heading2Lvl,但您尝试选择Heading1LvlName而不是Heading2LvlName
  4. 与2中相同的当前节点错误。当前节点为Heading2Lvl,您尝试使用Heading2/Heading3Lvl再次选择它。只需使用Heading3Lvl
  5. 即可

    修好所有这些后,您的模板如下所示:

    <xsl:template match="Chapters">
        <div style="padding-top:10%">
            <xsl:for-each select="Chapter/Heading1Lvl">
                <xsl:value-of select="Heading1LvlName"/>
                <xsl:for-each select="Heading2Lvl">
                    <xsl:value-of select="Heading2LvlName"/>
                    <xsl:for-each select="Heading3Lvl">
                        <xsl:value-of select="Heading3LvlName"/>
                    </xsl:for-each>
                </xsl:for-each>
            </xsl:for-each>
        </div>
    </xsl:template>