XSLT 中处理此类事情的标准方法是使用身份模板将所有内容逐字复制从输入到输出,然后在您想要更改某些内容时使用特定模板覆盖该模板。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!-- identity template to copy everything as-is unless overridden -->
<xsl:template match="*@|node()">
<xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
</xsl:template>
<!-- replace xref with a -->
<xsl:template match="xref">
<a><xsl:apply-templates select="@*|node()" /></a>
</xsl:template>
<!-- replace rid with href -->
<xsl:template match="xref/@rid">
<xsl:attribute name="href"><xsl:value-of select="." /></xsl:attribute>
</xsl:template>
</xsl:stylesheet>
如果您知道每个xref
元素肯定都有一个rid
属性,那么您可以将两个“特定”模板合并为一个。
请注意,没有任何基于 XSLT 的解决方案能够保留这样一个事实,即您的某些输入元素使用单引号作为属性,而其他输入元素使用双引号,因为此信息在 XPath 数据模型中不可用(两种形式完全等同于就 XML 解析器而言)。XSLT 处理器很可能总是对它输出的所有元素使用一种或另一种,而不管输入元素的外观如何。