如何在XML中从XSL动态获取值?

时间:2011-09-20 14:07:44

标签: xml xslt

我有一个xml文件和xsl文件链接到它,工作正常。我试图找出一种方法,我可以动态从xml拉取值而不是写

  

xsl:value-of select =“tag ...”

每次我在caseStudy标记中添加一个新节点。我包括下面的xml和xsl文件。

XML

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="caseStudies.xsl"?>

<caseStudiesList>
    <caseStudy>
        <tag1 label="tag1">TAG1_value</tag1>
        <tag2 label="tag2">TAG2_value</tag2>
        <tag3 label="tag3">TAG3_value</tag3>
        <tag4 label="tag4">TAG4_value</tag4>
        <tag5 label="tag5">TAG5_value</tag5>
    </caseStudy>
    <caseStudy>
        <tag1 label="tag1">TAG1_value</tag1>
        <tag2 label="tag2">TAG2_value</tag2>
        <tag3 label="tag3">TAG3_value</tag3>
    </caseStudy>
    <caseStudy>
        <tag1 label="tag1">TAG1_value</tag1>
        <tag2 label="tag2">TAG2_value</tag2>
        <tag3 label="tag3">TAG3_value</tag3>
        <tag4 label="tag4">TAG4_value</tag4>
        <tag5 label="tag5">TAG5_value</tag5>
        <tag6 label="tag6">TAG6_value</tag6>
        <tag7 label="tag7">TAG7_value</tag7>
    </caseStudy>
</caseStudiesList>

XSL

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
    <html>
        <head>
        </head>
        <body>
            <xsl:for-each select="caseStudiesList/caseStudy">
                <div class="caseStudyContainer ">
                    <ul>
                        <li>
                            <span><xsl:value-of select="tag1/@label" /></span>
                            <xsl:value-of select="tag1" />                          
                        </li>
                        <li>
                            <span><xsl:value-of select="tag2/@label" /></span>
                            <xsl:value-of select="tag2" />                          
                        </li>
                        <li>
                            <span><xsl:value-of select="tag3/@label" /></span>
                            <xsl:value-of select="tag3" />                          
                        </li>
                        <li>
                            <span><xsl:value-of select="tag4/@label" /></span>
                            <xsl:value-of select="tag4" />                          
                        </li>
                        <li>
                            <span><xsl:value-of select="tag5/@label" /></span>
                            <xsl:value-of select="tag5" />                          
                        </li>
                        <li>
                            <span><xsl:value-of select="tag6/@label" /></span>
                            <xsl:value-of select="tag6" />                          
                        </li>
                        <li>
                            <span><xsl:value-of select="tag7/@label" /></span>
                            <xsl:value-of select="tag7" />                          
                        </li>
                    </ul>
                </div>
            </xsl:for-each>
        </body>
    </html>
</xsl:template>
</xsl:stylesheet>

希望我有所作为。有没有办法从XML文件中在XSL中动态获取值?

谢谢

2 个答案:

答案 0 :(得分:2)

你只需要为另一个人嵌套另一个......

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
    <html>
    <head>
    </head>
    <body>
        <xsl:for-each select="caseStudiesList/caseStudy">
        <div class="caseStudyContainer ">
            <ul>
              <xsl:for-each select="*">
                <li>
                    <span><xsl:value-of select="@label" /></span>
                    <xsl:value-of select="." />                          
                </li>
              </xsl:for-each>
            </ul>
        </div>
        </xsl:for-each>
    </body>
    </html>
</xsl:template>
</xsl:stylesheet>

答案 1 :(得分:0)

作为XML中的规则,建议不要使用不同的标记名称来引用相同类型的数据。这是一种情况,即该规则真正进入了画面。您已经知道如何使用for-each,为什么不在这里应用呢?

 <xsl:for-each select="caseStudiesList/caseStudy">
                <div class="caseStudyContainer ">
                    <ul><xsl:for-each select="tag"><li><span><xsl:value-of select="@label" /></span><xsl:value-of select="." /></li>
                       </xsl:for-each></ul>
</div>
</xsl:for-each>

只需调用每个元素tag而不是tag1 tag2等等。而且,请考虑一个比“tag”更明智的名称。