我正在使用XSLT复制文件,我想复制某个节点的所有属性,但我想用新的属性替换一些属性。例如,我可能会这样:
<Library>
<Book author="someone" pub-date="atime" color="black" pages="900">
</Book>
</Library>
我怎么能复制这个,但用新值替换pub-date和color?有类似的东西吗?
<xsl:template match="/Library/Book">
<xsl:copy>
<xsl:attribute name="pub-date">1-1-1976</xsl:attribute>
<xsl:attribute name="color">blue</xsl:attribute>
<xsl:apply-templates select="*@[not pub-date or color] | node()"/>
</xsl:copy>
</xsl:template>
但这当然没有效果......
答案 0 :(得分:3)
我会像往常一样使用身份转换模板
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
然后添加
<xsl:template match="Book/@pub-date">
<xsl:attribute name="pub-date">1-1-1976</xsl:attribute>
</xsl:template>
<xsl:template match="Book/@color">
<xsl:attribute name="color">blue</xsl:attribute>
</xsl:template>
答案 1 :(得分:3)
另一种方法是依赖这样的事实,即如果相同的属性被写入两次,则最后一个获胜。所以:
<xsl:template match="/Library/Book">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:attribute name="pub-date">1-1-1976</xsl:attribute>
<xsl:attribute name="color">blue</xsl:attribute>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
(您是否确定要使用模糊日期格式1-1-1976?)