从子节点复制到父节点

时间:2015-07-10 09:32:39

标签: xslt xslt-1.0

我有这个结构

<a href="xxx" class="box">
  <img src="1.jpg" alt="CBA" title="ABC" class="imgresp" height="204" width="307">
</a>

我想要的是什么:
如果A-tag有类&#34;框&#34;
然后将title属性从img复制到父A-tag

预期产出:

<a href="xxx" class="box" title="ABC">
  <img src="1.jpg" alt="CBA" title="ABC" class="imgresp" height="204" width="307">
</a>

2 个答案:

答案 0 :(得分:0)

首先,XML需要格式正确,因此需要关闭img标记,否则就无法在其上使用XSLT。

<a href="xxx" class="box">
  <img src="1.jpg" alt="CBA" title="ABC" class="imgresp" height="204" width="307" />
</a>

假设确实如此,那么您需要阅读X SLT identity transform

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

就它本身而言,它只是将输入XML中的所有节点和属性按原样复制到输出XML,在您的情况下,它会带来99%的路径。

然后,您只需要一个模板来复制您需要的额外属性。在这种情况下,您需要一个与a标记匹配的模板,该标记会复制它,但也会添加额外属性。

<xsl:template match="a[@class='box']">
    <xsl:copy>
        <xsl:copy-of select="img/@title" />
        <xsl:apply-templates select="@*"/>
        <xsl:apply-templates select="node()"/>
    </xsl:copy>
</xsl:template>

或者像这样,使用Attribute Value Templates创建属性

<xsl:template match="a[@class='box']">
    <a title="{img/@title}">
        <xsl:apply-templates select="@*|node()"/>
    </a>
</xsl:template>

试试这个XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" />

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

    <xsl:template match="a[@class='box']">
        <a title="{img/@title}">
            <xsl:apply-templates select="@*|node()"/>
        </a>
    </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:0)

您可以创建一个匹配节点'a'和'img'及其属性的模板。此模板复制节点,如果存在属性“类”则进行测试以添加标题属性

  <xsl:template match="a/@* |img/@* | a | img">
    <xsl:copy>
        <xsl:if test="@class = 'box' ">
          <xsl:attribute name="title" select="img/@title"/>
        </xsl:if>
       <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>