是否可以查找并替换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”,请删除第一个文件夹。是否有一种简单的方法可以一次性完成这项工作?
答案 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>
请注意:
使用和覆盖身份规则。这是最基本,最强大的XSLT设计模式。
仅修改href
元素的image
个属性。
仅以字符href
或字符串"./"
开头的"./{something-different-than-screenshots}/"
属性以特殊方式处理(通过单独的模板)。
所有其他节点仅由身份模板处理。
这是一种纯粹的“推送式”解决方案。