有没有一种简单的方法来复制元素及其属性,同时只替换一些属性?

时间:2014-03-13 09:42:26

标签: xml xslt libxml2

我正在使用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>

但这当然没有效果......

2 个答案:

答案 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?)