添加属性时从子节点XSLT获取第3级父节点

时间:2012-12-07 06:22:42

标签: xslt

XML

 <root>
        <Algemeen>
             <foto>
                 <foe>
                     <fee>
                         <img src="www.blah.com/sample.jif"></img>
                     </fee>
                 </foe>
              </foto>
         </Algemeen>
    </root>

XSLT

 <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/foe/fee/img"/>
            </result>
        </xsl:template>

    <!--specific template match for this img -->
        <xsl:template match="/root/Algemeen/foto/foe/fee/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>

我正在通过模板向“img”标签添加属性,如何获得整个“foto”节点?这是“@ * | node()”是指第二级父节点“foe”?

查看了链接:

1 个答案:

答案 0 :(得分:0)

  

这是“@ * | node()”是指第二级父节点“foe”?

都能跟得上!这指的是子节点和属性。

  

如何复制<img>添加属性及其祖父<foto> ??

在您的代码中,您通过说<xsl:template match="/">来匹配根节点,并将其重命名为<result>。在那之下你说<xsl:apply-templates select="/root/Algemeen/foto/foe/fee/img"/> ..所以这将跳过层次结构并执行<xsl:template match="/root/Algemeen/foto/foe/fee/img">所说的..

您的<xsl:template match="/root/Algemeen/foto/foe/fee/img">模板看起来很完美!!你需要的只是低于修正!

<?xml version="1.0" encoding="utf-8"?>
<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"/>
    </result>
  </xsl:template>

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

  <!--specific template match for this img -->
  <xsl:template match="/root/Algemeen/foto/foe/fee/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>

如果您想访问父母或祖先,请尝试以下方法:

<xsl:for-each select="ancestor::foto">