gpt4 book ai didi

XSLT - 在单独的模板中向元素添加属性?

转载 作者:行者123 更新时间:2023-12-04 04:46:07 26 4
gpt4 key购买 nike

我正在尝试从另一个元素向 'xsl:element name="div"' 元素添加一个属性
模板,即 'xsl:template match="KTheme"' 模板,但我收到一个 XSLT 错误,没有关于失败原因或失败原因的错误信息。有没有办法做到这一点?

基本上,当从 'xsl:template name="DisplayFrame"' 模板执行 'xsl:apply-templates/' 行时,它与 'KTheme' 元素匹配并且应该将“style”属性添加到“div”元素:

<xsl:template match="Frame">
<xsl:call-template name="DisplayFrame">
<xsl:with-param name="FrameId" select="'frameHeader'" />
</xsl:call-template>
</xsl:template>

<xsl:template name="DisplayFrame">
<xsl:param name="FrameId" />

<xsl:element name="div">
<xsl:attribute name="id">
<xsl:value-of select="$FrameId" />
</xsl:attribute>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>

下面的模板是应该将“style”属性添加到“div”元素的地方。这个模板给了我一个错误,因为一旦我删除了 'xsl:attribute' 元素,XSLT 就会成功编译。
<xsl:template match="KTheme">
<xsl:attribute name="style">
<xsl:value-of select="." />
</xsl:attribute>
</xsl:template>

XML 文件示例:
<Document>
<Frame>
<KTheme>background-color: red;</KTheme>
</Frame>
</Document>

实际上,'KTheme' 元素是动态创建的,因此必须按照我的理论建议,通过从另一个模板添加属性来完成,但显然这是不正确的。这能做到吗?谢谢你的时间。

最佳答案

这里发生的事情是在 KTheme 前后都有空白文本节点。 ,以及将其添加到属性之前的输出之前的那个。在向父元素添加非属性节点后尝试向其添加属性是错误的。

为了玩得更安全,我建议直接瞄准KTheme元素,然后处理其他任何东西。这应该可以解决您的问题:

  <xsl:template name="DisplayFrame">
<xsl:param name="FrameId" />

<div id="{$FrameId}">
<xsl:apply-templates select="KTheme" />
<xsl:apply-templates select="node()[not(self::KTheme)]" />
</div>
</xsl:template>

我还使用 id 属性的属性值模板使其更简洁,但这不是必需的。

作为旁注,添加 <xsl:strip-space elements="*"/>到 XSLT 的顶部以去除空白文本节点也可以防止此错误,但我仍然认为在处理其他任何事情之前主动定位可能产生属性的任何内容是更明智的。在错误的时间意外添加属性会导致整个 XSLT 失败。

关于XSLT - 在单独的模板中向元素添加属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18158359/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com