在XSLT中嵌入标签

3

我有一个正常工作的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个回答

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>

嘿,谢谢你的帮助。顺便说一下,我已经更新了问题,你能帮我解决第二部分吗? - Pacerier
name().) 或 local-name(.) 可以让你在任何需要的地方获取节点名称。例如,如果你在一个循环中,<div id="{name(.)"> 就可以使用。这里的“.”是一个选择器,你可以用任何 XPath 替换它。 - Jordan

1
对于第二部分,将下划线转换为驼峰式写法,您可能想要查看XSLT标准库中的字符串处理。使用str:subst()在下划线处进行分割,str:to-camelcase()适当更改字母大小写,concat()添加"Label"后缀,您就完成了。

嗨,你能帮我解决这个问题吗?在那个页面上写着:str:substr() disable-output-escaping: A value of yes indicates that the result should have output escaping disabled. Any other value allows normal escaping of text values. The default is to enable output escaping. 但我仍然不理解它的意思。 - Pacerier
嗨,我无法让它工作:https://dev59.com/ZljUa4cB1Zd3GeqPNxAY - Pacerier
通常,XSLT 输出会在文本节点输出中转义 XML 中的特殊字符 "&" 和 "<"(以及可能的其他字符)。此参数可让您避免这种情况,例如,如果您从 XML 输入生成非 XML 输出。由于您正在寻找 XML 输出,因此可以将其保留为默认值“no”。请参阅 http://www.w3.org/TR/xslt#disable-output-escaping。 - DCharness

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>

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>

求求你了,使用库而不是像这样手动解析。请参考DCharness的答案。 - Jordan
@Jordan 你好,我无法让dcharness的答案起作用:https://dev59.com/ZljUa4cB1Zd3GeqPNxAY 你能帮我吗?谢谢。 - Pacerier
@Pacerier,你真的应该开另一个问题。你接受了一个与你最初提出的问题毫无关系的答案。 - Jordan
@Pacerier,是的,我理解你的意思,但是你编辑了原来的问题并加入了第二部分,通常应该将其作为一个单独的问题而不是添加在原问题中,否则答案会变得非常复杂。 - Jordan

0

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

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

否则,如果您需要另一个字符串,为什么对于@id,您会对<xsl:value-of select="area_of_expertise"/>感兴趣呢?


我不想亲自输入 areaOfExperiseLabel,我希望计算机可以从 area_of_expertise 推导出它。 - Pacerier
然而,如果您 事先不知道 元素名称,那么您的要求是有意义的。那么你的情况是这样吗?在这种情况下,您如何匹配它? - Emiliano Poggi
我需要一个函数来实现这个,因为 area_of_expertise 不是唯一需要这种转换的“字符串”,还有其他10个需要进行此camel-case转换的字符串。 - Pacerier
@empo 我无法让dcharness的答案起作用:https://dev59.com/ZljUa4cB1Zd3GeqPNxAY - Pacerier
你已经接受了答案,因此认为你对此满意。 - Emiliano Poggi
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接