使用XSLT修改XML文档的属性

时间:2013-02-18 11:07:11

标签: xml xslt

我有一个XML文件,其元素@url具有<matimage>属性。目前,@url属性中有一个特定的图片名称,例如triangle.png。我想应用XSLT并修改此URL,使其类似于assets/images/triangle.png

我尝试了以下XSLT:

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

  <!-- Copy everything -->
  <xsl:template match="*">
    <xsl:copy>
     <xsl:copy-of select="@*" />
     <xsl:apply-templates />
   </xsl:copy>
  </xsl:template>

 <xsl:template match="@type[parent::matimage]">
   <xsl:attribute name="uri">
     <xsl:value-of select="NEW_VALUE"/>
   </xsl:attribute>
 </xsl:template>
</xsl:stylesheet>

作为第一步,我尝试用新值替换旧值,但这似乎不起作用。请告诉我如何在@url属性的现有值前添加或附加新值。

以下是XML示例:

   <material>
    <matimage url="triangle.png">
        Some text
    </matimage>
  </material>

期望的输出:

   <material>
    <matimage url="assets/images/triangle.png">
        Some text
    </matimage>
  </material>

1 个答案:

答案 0 :(得分:5)

您尝试实现的目标的解决方案可能是:

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

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

    <!-- Match all the attributes url within matimage elements -->
    <xsl:template match="matimage/@url">
        <xsl:attribute name="url">
            <!-- Use concat to prepend the value to the current value -->
            <xsl:value-of select="concat('assets/images/', .)" />
        </xsl:attribute>
    </xsl:template>

</xsl:stylesheet>