我需要使用存储为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
答案 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']