XSL 转换以输出许多嵌入式 XSL 样式表

Posted

技术标签:

【中文标题】XSL 转换以输出许多嵌入式 XSL 样式表【英文标题】:XSL Transform to output a number of embedded XSL stylesheets 【发布时间】:2021-01-27 05:04:31 【问题描述】:

我希望编写一个 XSL 转换,它在 TEMPLATE 元素中输出许多嵌入的样式表(样式表集合由另一个组件在下游进行处理,该组件提取所需的样式并应用它)。所以我想通过转换生成一个 XML 文件,其中包含如下内容:

structure of the desired XML

    <?xml version="1.0"?>
<TEMPLATEDATA xmlns="http://www.sanjay.com/appname" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <TEMPLATE name="addFocus" operation="Add">
    <xsl:stylesheet version="1.0">
      <xsl:template match="/">
        <STRATEGICFOCUS />
      </xsl:template>
    </xsl:stylesheet>
  </TEMPLATE>

    
  <TEMPLATE name="addOrg" operation="Init">
    <xsl:stylesheet version="1.0"  xmlns:app="http://www.sanjay.com/myapp">
      <xsl:output method="xml" indent="yes"/>
      <xsl:param name="Name"></xsl:param>
      <xsl:template match="*">
          <CONTENT>
              <NAME><xsl:value-of select="$Name"/></NAME>
          </CONTENT>
      </xsl:template>
    </xsl:stylesheet>
  </TEMPLATE>
  
</TEMPLATEDATA>

我想通过像这样定义一个 XSL 转换来产生这个输出(忽略我正在转换的输入 XML,因为它并不重要):

desired transform

    <xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns="http://www.sanjay.com/myapp">

    <xsl:template match="/">
        <TEMPLATEDATA>
            <xsl:call-template name="template1" />
            <xsl:call-template name="template2" />
        </TEMPLATEDATA>
    </xsl:template>

    <xsl:template name="template1">
        <TEMPLATE name="addFocus" operation="Add">
            <xsl:stylesheet version="1.0">
                <xsl:template match="/">
                    <STRATEGICFOCUS />
                </xsl:template>
            </xsl:stylesheet>
        </TEMPLATE>
    </xsl:template>

    <xsl:template name="template2">
        <TEMPLATE name="addOrg" operation="Init"
            <xsl:stylesheet version="1.0"  xmlns:app="http://www.sanjay.com/myapp">
                <xsl:output method="xml" indent="yes"/>
                <xsl:param name="Name"></xsl:param>
                <xsl:template match="*">
                    <CONTENT>
                        <NAME>
                            <xsl:value-of select="$Name"/>
                        </NAME>
                    </CONTENT>
                </xsl:template>
            </xsl:stylesheet>
        </TEMPLATE>
    </xsl:template>
</xsl:stylesheet>

我收到样式表的 XSL 解析错误,指出内部 xsl:stylesheet 无效,因为它不能是 TEMPLATE 元素的子元素。谁能告诉我我必须做些什么来解决这个问题?我知道我可能可以将内部样式表嵌入 CDATA 部分,但我不想这样做。

桑杰

【问题讨论】:

【参考方案1】:

您似乎想为结果元素使用命名空间别名 https://www.w3.org/TR/xslt-30/#element-namespace-alias,例如

 <xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/>

xmlns:axsl="http://www.w3.org/1999/XSL/Transform-alias" 声明并用于例如

<xsl:template name="template1">
    <TEMPLATE name="addFocus" operation="Add">
        <axsl:stylesheet version="1.0">
            <axsl:template match="/">
                <STRATEGICFOCUS />
            </axsl:template>
        </xasl:stylesheet>
    </TEMPLATE>
</xsl:template>

【讨论】:

非常感谢马丁。我认为这将解决我的问题。

以上是关于XSL 转换以输出许多嵌入式 XSL 样式表的主要内容,如果未能解决你的问题,请参考以下文章

使用 XSL 样式表进行 ADO XML 清理

xsl 转换在 .net 环境中生成 xsl 样式表

预处理 XSL 样式表 - 包括外部文档

如何使用 XSL 生成 HTML 文件?

带有 Quartz 作业的 XSL 样式表路径

xml 错误 xsl 样式表