我有这个结构
<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>
答案 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>