XSl智能搜索和替换

时间:2010-10-14 22:49:40

标签: xml xslt

是否可以查找并替换xml元素的属性?我想更改href:

指向的目录

自:

<image href="./views/screenshots/page1.png">

<image href="screenshots/page1.png"> 

来自:

<image href="./screenshots/page2.png">

<image href="screenshots/page2.png">

因此,删除属于所有图像标记的href的所有“./”,但仅删除图像标记。此外,如果没有命名为“screenshots”,请删除第一个文件夹。是否有一种简单的方法可以一次性完成这项工作?

1 个答案:

答案 0 :(得分:1)

此转化:

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

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

 <xsl:template match="image/@href[starts-with(.,'./screenshots/')]">
  <xsl:attribute name="href">
   <xsl:value-of select="substring(.,3)"/>
  </xsl:attribute>
 </xsl:template>

  <xsl:template match=
   "image/@href
     [starts-with(.,'./')
     and not(starts-with(substring(.,3), 'screenshots/'))
     ]">
  <xsl:attribute name="href">
   <xsl:value-of select="substring-after(substring(.,3),'/')"/>
  </xsl:attribute>
 </xsl:template>


 <xsl:template priority="10"
      match="image/@href[starts-with(.,'./views/')]">
  <xsl:attribute name="href">
   <xsl:value-of select="substring(.,9)"/>
  </xsl:attribute>
 </xsl:template>
</xsl:stylesheet>

应用于此XML文档时

   <t>
    <image href="./views/screenshots/page1.png"/>
    <image href="./screenshots/page2.png"/>
    <load href="./xxx.yyy"/>
    <image href="ZZZ/screenshots/page1.png"/>
   </t>

产生想要的结果

<t>
    <image href="screenshots/page1.png"/>
    <image href="screenshots/page2.png"/>
    <load href="./xxx.yyy"/>
    <image href="ZZZ/screenshots/page1.png"/>
</t>

请注意

  1. 使用和覆盖身份规则。这是最基本,最强大的XSLT设计模式。

  2. 仅修改href元素的image个属性

  3. 仅以字符href或字符串"./"开头的"./{something-different-than-screenshots}/"属性以特殊方式处理(通过单独的模板)。

  4. 所有其他节点仅由身份模板处理

  5. 这是一种纯粹的“推送式”解决方案