当前位置: 首页 > 知识库问答 >
问题:

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

郎河
2023-03-14

我试图从另一个模板“xsl:template match=“KTheme”模板中向“xsl:element name=“div”元素添加一个属性,但是我得到了一个XSLT错误,没有关于失败原因或失败原因的错误信息。有没有办法做到这一点?

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

<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元素是动态创建的,因此必须按照我的理论建议,通过从另一个模板添加属性来完成,但显然这是不正确的。这能做到吗?谢谢你的时间。

共有2个答案

沈畅
2023-03-14

... 或使用AVT进行@style。。。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*" />

<xsl:template match="@*|node()" name="ident">
 <xsl:copy>
   <xsl:apply-templates select="@*|node()" />
 </xsl:copy> 
</xsl:template>  

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

</xsl:stylesheet>  
白浩气
2023-03-14

这里发生的事情是,在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属性的属性值模板使它变得更干净,但这不是必要的。

作为旁注,添加

 类似资料:
  • 我试图添加一个属性到一个节点,它是CDATA的一部分。我的XML是 结果应该是xml 文档节点中的id属性应作为属性添加到CDATA中的节点。 我能够以字段[@name='CDATA']的形式获取CDATA值,但我不确定如何将文档的属性添加到CDATA中。。 谁能给我建议一下怎么做,或者给我指出正确的方向?

  • 我正在将XML导入Access数据库。在转换过程中,数据之间的所有关系都会丢失。使用XSLT,我通过子节点将ID永久化。使用它,其中Id是添加到子节点的父元素: 我使用这种方法遇到的问题是父节点之外还有其他元素也具有元素或其变体,例如或类似的东西。当我尝试在上面的代码之外使用它时,的一些实例在以前的节点中丢失了。 很抱歉,我不知道在这里使用合适的语言,因为我对XSLT/XML不太熟悉。。。但我试图

  • 我有一个XML: 我想向根元素:/doc添加一个属性(名称空间),以便输出如下所示: 我尝试了三种xslt(跳过了默认的“复制所有”部分以减少问题的长度)。 xslt1:见下文,问题在于将空名称空间xmlns=”“添加到/doc的所有子节点(即:/doc/tag1和/doc/tag2) Xslt2:见下文,问题是“ns”被添加到根节点:和 xslt3:请参见下文,问题是报告了错误:未定义名称空间前

  • 问题内容: 假设我有一个数组,例如: 然后我想将一个元素推/追加到所述数组的末尾,以获得: 我应该使用哪种方法? 那我想在数组的 前面 添加一个元素呢?是否有固定的时间班次? 问题答案: 从 Swift 3/4/5开始 ,操作如下。 向数组末尾添加新元素。 将另一个数组附加到数组的末尾。 向您的数组中插入一个新元素。 将另一个数组的内容插入到数组中。 更多信息可以从第110页开始的“ Swift编

  • 英文原文:http://emberjs.com/guides/templates/binding-element-attributes/ 除了普通文本,你可能也希望在模板中包含可以将其属性绑定到控制器的HTML元素。 例如,想象一下你的控制器中包含这样一个属性,它包含指向一幅图像的URL地址: 1 2 3 <div id="logo"> <img {{bind-attr src=logoUr

  • 问题内容: 我想知道如何使用此代码段: 我知道这是关于编译阶段的,但是我不明白这一点,所以简短的解释将是非常感谢。 问题答案: 将另一个指令添加到同一元素的指令: 类似答案: 这是一个小矮人:http ://plnkr.co/edit/ziU8d826WF6SwQllHHQq?p=preview 更清洁的解决方案-完全不使用: 矮人:http ://plnkr.co/edit/jY10enUVm3