在xslt中嵌入标签

时间:2011-06-08 05:42:03

标签: html xml xslt xpath

我有这个xslt工作:

<xsl:when test="area_of_expertise">

    <div>
        <xsl:value-of select="area_of_expertise"/>
    </div>
</xsl:when>

但我需要的是:

<xsl:when test="area_of_expertise">

    <div id="<xsl:value-of select="area_of_expertise"/>">
        <xsl:value-of select="area_of_expertise"/>
    </div>
</xsl:when>

然而,第二个例子有错误..有谁知道为什么?

顺便问一下,有没有办法可以将节点的名称area_of_expertise转换为areaOfExperiseLabel并将其作为ID插入?我真正需要的输出是:

<div id="areaOfExpertiseLabel">
    asasdasdasd
</div>

5 个答案:

答案 0 :(得分:3)

它出错的原因是因为它不再是有效的XML。

要做你想做的事情:

<xsl:when test="title">

    <div id="{title}">
        <xsl:value-of select="title"/>
    </div>
</xsl:when>

您可以在{}标记内放置任何类型的选择器,如果您有复杂的内容,甚至可以引用变量。

<xsl:variable name="some_complex_variable">
    <xsl:value-of select="title"/>
</xsl:variable>

<xsl:when test="title">

    <div id="{$some_complex_variable}">
        <xsl:value-of select="title"/>
    </div>
</xsl:when>

第三种冗长的方法是使用xsl:attribute动态附加属性:

<xsl:when test="title">

    <div>
        <xsl:attribute name="id" select="title"/>
    </div>
</xsl:when>

答案 1 :(得分:1)

对于第二部分,从下划线转换为驼峰案例,您可能需要查看String Processing in the XSLT Standard Library。将str:subst()拆分为下划线,str:to-camelcase()适当更改字母大小写,concat()添加“Label”后缀,您应该设置。

答案 2 :(得分:1)

对于第一部分,您可以使用:

<xsl:when test="area_of_expertise">
    <div>
        <xsl:attribute name="id">
            <xsl:value-of select="area_of_expertise"/>
        </xsl:attribute>

        <xsl:value-of select="area_of_expertise"/>
    </div>
</xsl:when>

答案 3 :(得分:1)

第二部分尝试使用此模板:

<xsl:template name="parse">
        <xsl:param name="input"/>
        <xsl:param name="position"/>


        <xsl:if test="$position &lt;= string-length($input)">

            <xsl:choose>
                <xsl:when test="substring($input, $position, 1) = '_'">
                    <xsl:value-of select="translate(substring($input, $position + 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>

                    <xsl:call-template name="parse">
                        <xsl:with-param name="input" select="$input"/>
                        <xsl:with-param name="position" select="$position + 2"/>
                    </xsl:call-template>
                </xsl:when>

                <xsl:otherwise>

                    <xsl:value-of select="substring($input, $position, 1)"/>

                    <xsl:call-template name="parse">
                        <xsl:with-param name="input" select="$input"/>
                        <xsl:with-param name="position" select="$position + 1"/>
                    </xsl:call-template>
                </xsl:otherwise>
            </xsl:choose>

        </xsl:if>


    </xsl:template>

用法:

<xsl:call-template name="parse">
            <xsl:with-param name="input" select="'area_of_expertise'"/>
            <xsl:with-param name="position" select="1"/>
        </xsl:call-template>

答案 4 :(得分:0)

这可能是一个愚蠢的答案,但似乎你需要这个简单的痕迹:

<xsl:when test="area_of_expertise">
    <div id="areaOfExperiseLabel">
        <xsl:value-of select="area_of_expertise"/>
    </div>
</xsl:when>

否则,如果你需要另一个字符串,为什么你会在<xsl:value-of select="area_of_expertise"/>中为@id提出异议呢?