1

我有一个需求,我需要使用存储为 XSLT 参数的节点集将一个 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>

目前我无法找到一种方法来做到这一点。感谢您对此的任何帮助。

问候, 普拉巴斯

4

1 回答 1

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(结果树片段 ——一种非常受限的类型,它几乎禁止任何有意义的 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']
于 2012-09-17T12:54:55.737 回答