基于存储为xsl:param的节点集构造输出XML

时间:2012-09-17 12:38:54

标签: xml xslt

我需要使用存储为XSLT参数的节点集将一个XML文档转换为另一个XML文档。

输入:

<m:addCustomer xmlns:p="http://test.org"/>

预期输出格式:

<m:addCustomer xmlns:p="http://test.org"/>
   <m:e1>some_value1</m:e1>
   <m:e2>some_value2</m:e2>
   <m:e3>some_value3</m:e3>
</m:addCustomer>

我遇到的问题是,我可以传递“预期输出”格式内容的唯一方法是通过XSLT参数,如下所示。

<xsl:param name="testParam" xmlns:m="http://test.org">
    <m:customerData> 
         <m:e1>some_value1</m:e1>
         <m:e2>some_value2</m:e2>
         <m:e3>some_value3</m:e3>
    </m:customerData>
</xsl:param>

到目前为止,我已经尝试了以下XSLT配置而没有任何成功。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="utf-8" indent="no"/>
    <xsl:param name="testParam">
        <![CDATA[<m:customerData xmlns:m="http://cclk.lk">
    <m:e1>dfdf</m:e1>
    <m:e2>dfdf</m:e2>
    <m:e3>dfdf</m:e3></m:customer>]]>
    </xsl:param>
    <xsl:template match="/" xmlns:m="http://cclk.lk">
        <m:addCustomer>
            <xsl:value-of select="$testParam" disable-output-escaping="yes"/>
            <xsl:apply-templates select="m:customerData"/>
        </m:addCustomer>
    </xsl:template>

    <xsl:template match="m:customerData" xmlns:m="http://cclk.lk">
        <m:addUser>
            <xsl:for-each select="m:customer/*">
                <m:e1>
                    <xsl:value-of select="e1"/>
                </m:e1>
                <m:e2>
                    <xsl:value-of select="e2"/>
                </m:e2>
                <m:e3>
                    <xsl:value-of select="e3"/>
                </m:e3>
            </xsl:for-each>
        </m:addUser>
    </xsl:template>
</xsl:stylesheet>

目前我无法找到办法做到这一点。感谢任何帮助。

此致 Prabath

1 个答案:

答案 0 :(得分:2)

指定的参数

<xsl:param name="testParam" xmlns:m="http://test.org">
    <m:customerData> 
         <m:e1>some_value1</m:e1>
         <m:e2>some_value2</m:e2>
         <m:e3>some_value3</m:e3>
    </m:customerData>
</xsl:param>
XSLT 1.0中的

创建了一个RTF(Result Tree Fragment - 一种非常受限制的类型,几乎禁止任何有意义的XPath表达式评估。

解决方案

使用供应商提供的扩展功能xxx:node-set(),它将RTF转换为常规树。

请注意,此扩展函数名称位于供应商定义的名称空间中,因供应商而异。

尝试提供独立于供应商的实现 - 在EXSLT中定义的实现:

<强> ext:node-set()

其中前缀ext绑定到名称空间http://exslt.org/common

大多数XSLT 1.0处理器(包括.NET XslCompiledTransform)都实现ext:node-set()


如果您不想要任何扩展功能,那么解决方案是使用标准XSLT 1.0函数document() ,如下所示:

document('')/*/xsl:param[@name='testParam']