data.xml中:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="myxslt2.xslt"?>
<data>
<foo>Hello</foo>
<bar>World</bar>
<foobar>This is a test</foobar>
</data>
myxslt2.xslt
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" version="1.0">
<xsl:output method="html" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" indent="yes"/>
<xsl:variable name="main" select="/data"/>
<xsl:template name="myTemplate">
<xsl:param name="myparam"/>
Inner1:<xsl:value-of select="msxsl:node-set($myparam)"/>
<br/>
Inner2:<xsl:value-of select="msxsl:node-set($myparam)/foobar"/>
</xsl:template>
<xsl:template match="/data">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
HTML STARTS
<br/>
<xsl:variable name="data" select="."/>
Outer1:<xsl:value-of select="$data"/>
<br/>
Outer2:<xsl:value-of select="$data/foobar"/>
<br/>
<xsl:call-template name="myTemplate">
<xsl:with-param name="myparam">
<xsl:value-of select="$data"/>
</xsl:with-param>
</xsl:call-template>
</html>
</xsl:template>
</xsl:stylesheet>
输出:
HTML STARTS
Outer1: Hello World This is a test
Outer2:This is a test
Inner1: Hello World This is a test
Inner2:
有人可以解释为什么内部不会解析子元素而外部是吗?
答案 0 :(得分:1)
问题在于将 $ data 变量作为参数传递给 myTemplate
<xsl:call-template name="myTemplate">
<xsl:with-param name="myparam">
<xsl:value-of select="$data"/>
</xsl:with-param>
</xsl:call-template>
由于您在此使用 xsl:value-of ,因此仅传递 $ data 中保存的节点的文本值;即参数只是一个文本节点。要保留节点,您需要使用 xsl:copy-of
<xsl:call-template name="myTemplate">
<xsl:with-param name="myparam">
<xsl:copy-of select="$data"/>
</xsl:with-param>
</xsl:call-template>
严格来说,这会传递一个“结果树片段”,这就是为什么你必须使用节点集扩展函数,但你必须修改你对它的使用,因为 data 节点这里不是严格的父节点,文档片段是
Inner1:<xsl:value-of select="msxsl:node-set($myparam)/data"/>
<br />
Inner2:<xsl:value-of select="msxsl:node-set($myparam)/data/foobar"/>
但是,实际上你根本不必使用 node-set 。更改如何将模板调用到此...
<xsl:call-template name="myTemplate">
<xsl:with-param name="myparam" select="$data"/>
</xsl:call-template>
这里有一个重要的区别。这不再是结果树片段,而是直接引用输入文档,这意味着您根本不必使用节点集。
<xsl:template name="myTemplate">
<xsl:param name="myparam"/>
Inner1:<xsl:value-of select="$myparam"/>
<br />
Inner2:<xsl:value-of select="$myparam/foobar"/>
</xsl:template>