我看过很多帖子都是这样做的,这让我觉得这是可能的,我只是做错了什么.我尽可能地简化了它,试图弄清楚为什么会这样:
继承人我的xml(没什么好激动的):
- <?xml version="1.0" encoding="UTF-8"?>
- <REPORT>
- </REPORT>
这是我的xsl:
- <?xml version="1.0" encoding="utf-8"?>
- <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
- <xsl:template match="REPORT">
- <xsl:variable name="tryThisTemplate">
- <xsl:call-template name="TRY_THIS"/>
- </xsl:variable>
- <TEST1>
- <xsl:call-template name="TRY_THIS"/>
- </TEST1>
- <TEST2>
- <xsl:value-of disable-output-escaping="yes" select="$tryThisTemplate" />
- </TEST2>
- <TEST3>
- <xsl:value-of select="$tryThisTemplate" />
- </TEST3>
- </xsl:template>
- <xsl:template name="TRY_THIS">
- <MY_NODE desc="my description" />
- </xsl:template>
- </xsl:stylesheet>
这是我的结果:
- <?xml version="1.0" encoding="utf-8"?>
- <TEST1>
- <MY_NODE desc="my description"/>
- </TEST1>
- <TEST2></TEST2>
- <TEST3></TEST3>
这是我的问题:
为什么TEST2和TEST3不起作用. $tryThisTemplate变量似乎为空.我在这里误解了什么.我应该以不同的方式做这件事吗?
这是执行此操作的正确方法(请注意,DOE不是必需的,应该避免):
- <xsl:stylesheet
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
- <xsl:output omit-xml-declaration="yes" indent="yes"/>
- <xsl:template match="REPORT">
- <xsl:variable name="tryThisTemplate">
- <xsl:call-template name="TRY_THIS"/>
- </xsl:variable>
- <TEST1>
- <xsl:call-template name="TRY_THIS"/>
- </TEST1>
- <TEST2>
- <xsl:copy-of select="$tryThisTemplate" />
- </TEST2>
- <TEST3>
- <xsl:copy-of select="$tryThisTemplate" />
- </TEST3>
- </xsl:template>
- <xsl:template name="TRY_THIS">
- <MY_NODE desc="my description" />
- </xsl:template>
- </xsl:stylesheet>
当此转换应用于提供的XML文档时:
- <REPORT>
- </REPORT>
产生了想要的结果:
- <TEST1>
- <MY_NODE desc="my description"/>
- </TEST1>
- <TEST2>
- <MY_NODE desc="my description"/>
- </TEST2>
- <TEST3>
- <MY_NODE desc="my description"/>
- </TEST3>
说明:< xsl:copy-of>副本(如其名称所示)节点. < XSL:value-of的>输出其select属性中的任何内容的字符串值.元素的字符串值是其所有文本节点后代的串联(按文档顺序).在您的情况下,元素没有文本节点后代,因此< xsl:value-of>没有输出.