您好我必须使用XSLT替换给定标记的多个属性,同时使用标识模板复制整个文件。使用我给定的XSLT,我可以替换一个属性(类的值)而不是另一个属性。 输入文件:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="generator" content=
"HTML Tidy for Linux/x86 (vers 11 February 2007), see www.w3.org" />
<meta http-equiv="Content-type" content="text/html; charset=us-ascii" />
<title></title>
</head>
<body>
<!--OTHER STUFF-->
<div class="LR" id="12">
</div>
<!--OTHER STUFF-->
</body>
</html>
输出文件:
<?xml version="1.0" encoding="utf-8"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="generator" content=
"HTML Tidy for Linux/x86 (vers 11 February 2007), see www.w3.org" />
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" />
<title></title>
</head>
<body>
<!--OTHER STUFF-->
<div class="WZ" id="56">
</div>
<!--OTHER STUFF-->
</body>
</html>
我的XSLT:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns="http://www.w3.org/1999/xhtml"
exclude-result-prefixes="xhtml">
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="xhtml:div[@id='12']/@class">
<xsl:attribute name="class">WZ</xsl:attribute>
<xsl:attribute name="id">56</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
感谢你!
答案 0 :(得分:6)
此模板还会复制&lt; div&gt;的所有额外属性。节点可能有,因此它是一个更强大的解决方案。
此模板......
<xsl:template match="xhtml:div[@id='12']"
xmlns="http://www.w3.org/1999/xhtml">
<div id="56" class="WZ">
<xsl:apply-templates select="
(@*[local-name()!='id']
[local-name()!='class'])
| node()"/>
</div>
</xsl:template>
...将转换此元素...
<div class="LR" id="12" other="x">
<强> ...到... 强>
<div id="56" class="WZ" other="x" />
请注意,保留额外属性“other”!
除了回答问题之外,还有一些普遍的兴趣,这里有几个等价的替代方案......
这是另一个执行相同操作的XSLT 1.0模板。效率较低但更简洁(好吧,有点)......
<xsl:template match="xhtml:div[@id='12']"
xmlns="http://www.w3.org/1999/xhtml">
<div>
<xsl:apply-templates select="@*" />
<xsl:attribute name="id">56</xsl:attribute>
<xsl:attribute name="class">WZ</xsl:attribute>
<xsl:apply-templates select="node()" />
</div>
</xsl:template>
我知道OP正在使用XSLT 1.0。这只是为了兴趣。想要简洁和高效吗?从不畏惧!这是XSLT 2.0替代方案的帮助......
<xsl:template match="xhtml:div[@id='12']"
xmlns="http://www.w3.org/1999/xhtml">
<div id="56" class="WZ">
<xsl:apply-templates select="@* except (@id,@class) | node()" />
</div>
</xsl:template>
答案 1 :(得分:-1)
尝试匹配@*
:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns="http://www.w3.org/1999/xhtml"
exclude-result-prefixes="xhtml">
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
<xsl:strip-space elements="*" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="xhtml:div[@id='12']/@*">
<xsl:attribute name="class">WZ</xsl:attribute>
<xsl:attribute name="id">56</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
这给出了期望的结果:
<div class="WZ" id="56"></div>