在XSLT中获取子节点的值

时间:2019-01-08 21:42:21

标签: xml xslt parent-child

我对XML和XSLT还是很陌生,但是我试图创建一个HTML页面,该页面循环经过不同的步骤,并生成HTML列表。

XML看起来像这样:

new_dict = {k: v for k, v in my_dict.items() if v in fruit_list}

我拥有它,因此可以显示我正在搜索的模块的标题,受众,任务等信息,从而可以正常工作。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <module>
        <name ID="SDCModule002">
            <role>SDC</role>
            <modNum>002</modNum>
            <title>Test</title>
            <audience>me</audience>
            <numSteps>7</numSteps>
            <steps>
                <step1>Do this 1</step1>
                <step2>Do this 2</step2>
                <step3>Do this 3</step3>
                <step4>Do this 4</step4>
                <step5>Do this 5</step5>
                <step6>Do this 6</step6>
                <step7>Do this 7</step7>
            </steps>
        </name>
        <name ID="SDCModule003">
            <role>SDC</role>
            <modNum>003</modNum>
            <title>Hi</title>
            <audience>you</audience>
            <numSteps>4</numSteps>
            <steps>
                <step1>Hi</step1>
                <step2>There</step2>
                <step3>You</step3>
                <step4>Guys</step4>
            </steps>
        </name>
    </module>
</xml>

我认为我需要有一个<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/xml"> <html> <head> <title><xsl:value-of select="module/name[@ID='SDCModule001']/title "/></title> </head> <xsl:apply-templates select="module/name[@ID='SDCModule001']"/> </body> </html> </xsl:template> <xsl:template name="stepList" match="name"> <div id= "info"> <center> <font face="verdana" size="2"><b><center><xsl:value-of select="title" /></center></b></font> <hr></hr> <xsl:value-of select="audience" /> <p></p> <xsl:value-of select="numSteps" /> </center> </div> </xsl:template> </xsl:stylesheet> 来列出有序列表中的步骤,因此SDCModule002将具有7个步骤,而SDCModule003将仅具有4个步骤,或者我是否只获取了所有子节点的值?父母<xsl:for-each>

如果语句“如果numSteps为1,则执行此操作....如果numSteps为2,则执行该操作”,我不想执行15,等等...我可以,它可以工作,但我不能确保是否有更有效的方法。

已编辑

预期结果如下:

模块:SCDModule001 标题:测试 观众:我 脚步: 1.这样做1 2.这样做2 3.这样做3 4.这样做4 6.这样做5 7.这样做6 8.这样做7

2 个答案:

答案 0 :(得分:1)

xsl:for-each元素上方合并一个step?可能如下所示。我还更改了一些xsl:apply-templates以在输出中显示所有module/name。输出效果不佳,但应该为您提供一个良好的开端。不要忘记添加

<?xml-stylesheet href="test.xslt" type="text/xsl" ?>

在您的XML中插入一行以在浏览器中运行它。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="text()" />

<xsl:template match="/xml">
    <html>
        <head>
            <title>***<xsl:value-of select="module/name[@ID='SDCModule002']/title "/>***</title>
        </head>
        <body>
            <xsl:apply-templates select="module/name"/>
        </body> 
    </html> 
</xsl:template> 

<xsl:template match="steps">
    <div id= "info">
        <center>
            <font face="verdana" size="2">
                <b>
                    <center>
                        <xsl:value-of select="../title" />
                    </center>
                </b>
            </font>
            <hr />
            <xsl:value-of select="../audience" />
            <p></p>
            <xsl:value-of select="../numSteps" />
            <ol>
                <xsl:for-each select="*">
                    <li><xsl:value-of select="." /></li>
                </xsl:for-each>
            </ol>
        </center>
    </div>
</xsl:template>

</xsl:stylesheet>

在Firefox中,输出如下所示:

Output image

答案 1 :(得分:1)

根据经验,应避免在不需要时使用xsl:for-each。尽管这并不重要,但是对于小型翻译或项目而言,还是明智的选择。 apply-templates的附加好处是,如果在实现过程中更改了输入,则只需更改xpath。

这是一个示例,每个模块创建2个html文件。与“步骤”匹配的模板是额外的,您无需使其生效。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/xml">
    <xsl:apply-templates select="module/name"/>
</xsl:template>
<!--Each name is a file - but can easily changed to module -->
<xsl:template match="name">
    <html>
        <head>
            <title>***<xsl:value-of select="@ID"/>***</title>
        </head>
        <body>
            <div id= "info">
                <center>
                    <font face="verdana" size="2">
                        <b>
                            <center>
                                <xsl:value-of select="title" />
                            </center>
                        </b>
                    </font>
                    <hr />
                    <xsl:value-of select="audience" />
                    <p></p>
                    <xsl:apply-templates select="steps"/>
                </center>
            </div>
        </body>
    </html>
</xsl:template>

<!--Extra match for styling - steps can also directly be called from "name" template-->
<xsl:template match="steps">
    <xsl:value-of select="numSteps" />
    <ol>
        <xsl:apply-templates select="node()" mode="steps"/>
    </ol>
</xsl:template>

<!--Wildcard - matches all step nodes-->
<xsl:template match="*" mode="steps">
    <li><xsl:value-of select="." /></li>
</xsl:template>