以前从未做过 XSLT。是否可以继承文档并仅替换一个标签?如果是,你能提供任何例子吗?
谢谢
你从模板开始
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
然后你添加模板来转换你想要转换的节点,例如
<xsl:template match="td">
<th>
<xsl:apply-templates select="@* | node()"/>
</th>
<xsl:template>
将所有td
元素转换为th
元素或
<xsl:template match="h6"/>
删除所有h6
元素。
如果你想转换一个单一的td
那么你需要一些方法来识别它,假设它有一个id
属性使用一个匹配模式,比如
<xsl:template match="td[@id = 'td1']">
<td style="background-color: lightgreen;">
<xsl:apply-templates select="@* | node()"/>
</td>
</xsl:template>
该示例设置特定元素的 CSSbackground-color
属性。td
最好使用最基本的 XSLT 设计模式来处理此任务:使用和覆盖标识规则:
让我们拥有这个 XML 文档:
<root>
<x>This is:</x>
<a>
<b>
<c>hello</c>
</b>
</a>
<a>
<b>
<c1>world</c1>
</b>
</a>
<a>
<b>!</b>
</a>
<y>The End</y>
</root>
任务是:
删除所有c
元素。
将任何b
元素重命名为d
.
c2
在任何元素之后插入一个c1
元素。
解决方案非常简短:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="c"/>
<xsl:template match="b">
<d><xsl:apply-templates select="node()|@*"/></d>
</xsl:template>
<xsl:template match="c1">
<xsl:call-template name="identity"/>
<c2>xxx</c2>
</xsl:template>
</xsl:stylesheet>
当对上述 XML 文档应用此转换时,会产生所需的正确结果:
<root>
<x>This is:</x>
<a>
<d/>
</a>
<a>
<d>
<c1>world</c1>
<c2>xxx</c2>
</d>
</a>
<a>
<d>!</d>
</a>
<y>The End</y>
</root>
说明:
身份模板在选择执行或按名称调用时,会“按原样”复制当前节点。
对于每个特殊任务(删除、插入和重命名),我们添加一个单独的模板来匹配所需的节点,从而覆盖身份模板,因为它具有更高的特异性。
选择覆盖的、更具体的模板在它匹配的节点上执行,并执行我们需要执行的任务。