本文介绍了用xsl将XML属性值替换为常量值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
有XML节点
<svg>
<g transform="translate(113.63-359.13)">
<use fill="#f00" xlink:href="#D"/>
<g transform="translate(72.59-8.504)">
<use xlink:href="#E"/>
<path fill="#f00" stroke="#000" stroke-linejoin="round" stroke-linecap="round" stroke-width=".24" d="m6.04 526.26h19.843v4.961h-19.843z"/>
<use xlink:href="#F"/>
</g>
<text x="20.41" y="527.6" fill="#000" font-family="Arial" font-size="8">ProcessOutbound</text>
</g>
</svg>
可以在此Xpath中找到
which can be found by this Xpath
/svg/g[text="ProcessOutbound"]/use
这也很好
/svg/g[text="ProcessOutbound"]/use/@fill
但是由于某些原因,xsl并未将#f00替换为#00f,这已经让我们感到疲倦了
but for some reasons that xsl is not replaceing #f00 with #00f which is what have tired
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
<xsl:param name="blue" select="'#00f'"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match='/svg/g[text="ProcessOutbound"]/use'>
<xsl:attribute name='fill'>
<xsl:value-of select="'$blue'"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
实际上,整个svg文件已复制,但不替换fill属性.我尝试获取一个副本,但替换为填充值
actually the whole svg file is copied but the fill attribute is not replaced. I tried to achive a copy but with the replaced fill value
用xsl将属性值替换为常数值的正确方法是什么?
What is the correct way to replace attribut values with constant values by xsl ?
所以预期结果应该像
<g transform="translate(113.63-359.13)">
<use fill="#00f" xlink:href="#D"/>
<g transform="translate(72.59-8.504)">
<use xlink:href="#E"/>
<path fill="#f00" stroke="#000" stroke-linejoin="round" stroke-linecap="round" stroke-width=".24" d="m6.04 526.26h19.843v4.961h-19.843z"/>
<use xlink:href="#F"/>
</g>
<text x="20.41" y="527.6" fill="#000" font-family="Arial" font-size="8">ProcessOutbound</text>
</g>
推荐答案
您的XSLT有一些不正确的地方:
There are a few things incorrect with your XSLT:
- 它正在尝试将整个'use'元素替换为一个属性.
- 您在
$blue
周围使用两对引号,这导致将其视为字符串. - 即使您的XML使用名称空间,您也没有使用名称空间.
- It is trying to replace the whole 'use' element with an attribute.
- You are using two pairs of quotes around
$blue
, which causes it to be treated as a string. - You are not using namespaces even though your XML uses a namespace.
请尝试以下操作:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:svg="http://www.w3.org/2000/svg">
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
<xsl:param name="blue" select="'#00f'"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match='svg:g[svg:text = "ProcessOutbound"]/svg:use/@fill'>
<xsl:attribute name='fill'>
<xsl:value-of select="$blue"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
在示例输入上运行时,结果为:
When run on your sample input, the result is:
<svg xmlns:xlink="...">
<g transform="translate(113.63-359.13)">
<use xlink:href="#D" fill="#00f" />
<g transform="translate(72.59-8.504)">
<use xlink:href="#E" xmlns:xlink="x" />
<path fill="#f00" d="m6.04 526.26h19.843v4.961h-19.843z" stroke-width=".24" stroke-linecap="round" stroke-linejoin="round" stroke="#000" />
<use xlink:href="#F" />
</g>
<text font-family="Arial" fill="#000" font-size="8" y="527.6" x="20.41">ProcessOutbound</text>
</g>
</svg>
http://www.xsltcake.com/slices/d8pdoi
这篇关于用xsl将XML属性值替换为常量值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!