能否用XSLT转换XSLT样式表?.NET下XSLT1.0实现困境
解决XSLT 1.0生成含xsl:param的中间样式表问题
核心问题在于:直接在样式表中写<xsl:param>这类XSLT命名空间的元素时,处理器会将其当作自身执行的指令,而非输出到结果树的节点。要纯XSLT实现生成中间样式表,必须通过<xsl:element>显式创建XSLT命名空间的元素。
具体实现步骤
1. 配置XML示例
假设你的配置文件结构如下:
<config> <param name="documentTitle" value="产品手册"/> <param name="copyrightYear" value="2024"/> </config>
2. 生成中间XSLT的样式表
创建如下XSLT 1.0样式表,通过<xsl:element>创建XSLT命名空间的元素:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 确保输出格式为XML,缩进美化 --> <xsl:output method="xml" indent="yes" encoding="UTF-8"/> <xsl:template match="/"> <!-- 生成中间样式表的根节点 --> <xsl:element name="xsl:stylesheet" namespace="http://www.w3.org/1999/XSL/Transform"> <xsl:attribute name="version">1.0</xsl:attribute> <!-- 遍历配置中的参数节点,生成对应的xsl:param元素 --> <xsl:for-each select="config/param"> <xsl:element name="xsl:param" namespace="http://www.w3.org/1999/XSL/Transform"> <!-- 设置参数名称 --> <xsl:attribute name="name"> <xsl:value-of select="@name"/> </xsl:attribute> <!-- 设置参数默认值,用单引号包裹字符串 --> <xsl:attribute name="select"> <xsl:text>'</xsl:text> <xsl:value-of select="@value"/> <xsl:text>'</xsl:text> </xsl:attribute> </xsl:element> </xsl:for-each> </xsl:element> </xsl:template> </xsl:stylesheet>
3. 生成的中间样式表效果
执行上述转换后,会生成如下有效的XSLT文件:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:param name="documentTitle" select="'产品手册'"/> <xsl:param name="copyrightYear" select="'2024'"/> </xsl:stylesheet>
关键原理
- 使用
<xsl:element>并指定XSLT的官方命名空间URI(http://www.w3.org/1999/XSL/Transform),会让处理器将该元素当作普通XML节点输出,而非自身执行的指令。 - 必须显式指定命名空间,即使当前样式表已声明xsl前缀,否则生成的元素可能无法正确关联XSLT命名空间,导致中间样式表无效。
后续步骤
主样式表只需通过<xsl:include href="中间样式表路径.xsl"/>引用生成的文件,即可直接使用这些全局参数。
内容的提问来源于stack exchange,提问作者Alasdair C-S
相关产品推荐
相关产品推荐

