使用<xsl:for-each>遍历属性

时间:2019-12-12 00:14:08

标签: xslt xslt-1.0 xslt-2.0

我试图遍历以下XML,以获取基于属性值的列表。可以将@field值作为变量传递给for-each吗?

尝试使用<xsl:for-each select="project[@field='author']/projectValue">,但最终为每个字段重复了循环

示例XML

<Properties>
    <projects>
        <project field="author">
            <projectValue count="3">disney</projectValue>
            <projectValue count="3">mark</projectValue>
        </project>
        <project field="type">
            <projectValue count="6">news</projectValue>
            <projectValue count="31">page</projectValue>
        </project>
    </projects>
</Properties>

XSL

<xsl:template match="/">
    <ul class="gta-2">
        <xsl:apply-templates select="/Properties/projects" />
    </ul>
    <ul class="gta-2">
        <xsl:apply-templates select="/Properties/projects"/>
    </ul>
</xsl:template>
<xsl:template match = "projects" >
    <xsl:for-each select="project/projectValue">
        <li>
            <xsl:value-of select="." />
        </li>
    </xsl:for-each>
</xsl:template>

输出

<ul class="author">
    <li>disney</li>
    <li>mark</li>
    <li>news</li>
    <li>page</li>
</ul>
<ul class="type">
    <li>disney</li>
    <li>mark</li>
    <li>news</li>
    <li>page</li>
</ul>

预期产量

<ul class="author">
    <li>disney</li>
    <li>mark</li>
</ul>
<ul class="type">
    <li>news</li>
    <li>page</li>
</ul>

1 个答案:

答案 0 :(得分:1)

尝试使用这两个模板:

kube-apiserver

其输出是:

<xsl:template match = "project" >
    <ul class="{@field}">
        <xsl:apply-templates select="projectValue"/>
    </ul>
</xsl:template>

<xsl:template match = "projectValue" >
    <li><xsl:value-of select="." /></li>
</xsl:template>

这可能是创建所需输出的最直接方法。无需传递任何属性。每个(属性)值都在相应的模板中处理。清晰明了。