代码之家  ›  专栏  ›  技术社区  ›  Jules Colle

xslt如何将属性添加到

  •  27
  • Jules Colle  · 技术社区  · 14 年前

    <xsl:copy-of select="/root/Algemeen/foto/node()" />
    

    在XML文件中,节点 /root/Algemeen/foto/

    我想做的是添加一个固定宽度的图像。但以下方法不起作用:

    <xsl:copy-of select="/root/Algemeen/foto/node()">
        <xsl:attribute name="width">100</xsl:attribute>
    </xsl:copy-of>
    
    1 回复  |  直到 13 年前
        1
  •  51
  •   Mads Hansen    14 年前

    xsl:copy-of 执行所选节点的深度复制,但不提供更改它的机会。

    你会想用 xsl:copy 然后在内部添加其他节点。 只复制节点和命名空间属性,而不复制常规属性和子节点,因此您需要确保 apply-templates 把其他节点也推过去。 没有一个 @select ,它在当前节点上工作,因此无论您在何处应用 <xsl:copy-of select="/root/Algemeen/foto/node()" /> ,您需要更改为 <xsl:apply-templates select="/root/Algemeen/foto/node()" /> 然后移动 img 将逻辑转换为模板。

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:template match="/">
            <result>
        <xsl:apply-templates select="/root/Algemeen/foto/img"/>
            </result>
        </xsl:template>
    
    <!--specific template match for this img -->
        <xsl:template match="/root/Algemeen/foto/img">
          <xsl:copy>
                <xsl:attribute name="width">100</xsl:attribute>
                <xsl:apply-templates select="@*|node()" />
              </xsl:copy>
        </xsl:template>
    
    <!--Identity template copies content forward -->
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
    
    </xsl:stylesheet>