0

数据.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:

有人可以解释为什么内部不解决子元素而外部解决?

4

1 回答 1

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>

严格来说,这传递了一个“结果树片段”,这就是为什么你必须使用节点集扩展功能,但是你必须修改你对它的使用,因为数据节点在这里并不是严格的父节点,文档片段是

    Inner1:<xsl:value-of select="msxsl:node-set($myparam)/data"/>
    <br />
    Inner2:<xsl:value-of select="msxsl:node-set($myparam)/data/foobar"/>

但是,您实际上根本不必在这里使用节点集。将模板调用方式更改为此...

<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>
于 2013-10-10T07:24:40.913 回答