我花了2个小时在互联网上寻求帮助,但我没有找到任何答案......
我希望你能:)
所以,我的xslt文件正在关注(简化):
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:param name="basename"/>
<xsl:param name="purpose"/>
<xsl:param name="xml_input_path"/>
<xsl:param name="self"/>
<xsl:template match="testspec">
<xsl:call-template name="call_commands"/>
</xsl:template>
<xsl:template name="call_commands">
<xsl:variable name="root" select="document($xml_input_path)/testspec"/>
<xsl:for-each select="$root//command">
<xsl:sort select="."/>
<xsl:variable name="current" select="."/>
<xsl:apply-templates select="document($self)/xsl:stylesheet/xsl:template[@name = $current/@label]"/>
</xsl:for-each>
</xsl:template>
<xsl:template name="TOTO_short">
<xsl:text>Fonction TOTO :</xsl:text>
<xsl:variable name="dda" select="'b'"/>
<xsl:copy-of select="$dda"/>
</xsl:template>
<xsl:template name="TATA_interrupt">
Fonction TATA :
<xsl:variable name="v1_name" select="'NaN'"/>
<xsl:value-of select="$v1_name" />
</xsl:template>
</xsl:stylesheet>
这是我的输入Xml:
<testspec>
<command label="TOTO_short"/>
<command label="TATA_interrupt"/>
<command label="TOTO_short"/>
<command label="TATA_interrupt"/>
</testspec>
我的问题如下:在模板TOTO_short和TATA_short中,我想定义2个变量并显示它们的值......
但它不起作用!
你能帮助我理解它的来源吗?
提前多多感谢:)
阿诺
答案 0 :(得分:2)
问题在于这个相当疯狂的线条
<xsl:apply-templates select="document($self)/xsl:stylesheet/xsl:template[@name = $current/@label]"/>
看起来您正在尝试使用等于当前label
属性的名称来调用命名模板。但要调用命名模板,必须使用 xsl:call-template 。对于您当前的 xsl:apply-templates 来查找任何内容,您需要一个类似的模板:
<xsl:template match="xsl:template[@name='TOTO_short']">
<xsl:call-template name="TOTO_short" />
</xsl:template>
这真的不是去做事的方法!您的命名模板似乎工作的原因是因为这里使用了XSLT中的内置模板。当它找不到上面的匹配模板时,它只会输出元素的文本。
我真的不需要这么复杂的方法。您可以简单地执行以下操作,而不是当前的 xsl:for-each :
<xsl:apply-templates select="$root//command" />
然后你有一个匹配的模板,如下:
<xsl:template match="command[@label='TOTO_short']">
<xsl:text>Fonction TOTO :</xsl:text>
<xsl:variable name="dda" select="'b'"/>
<xsl:copy-of select="$dda"/>
</xsl:template>
试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:param name="basename"/>
<xsl:param name="purpose"/>
<xsl:param name="xml_input_path" select="'C:\Users\Tim Case\Documents\Test.xml'" />
<xsl:param name="self"/>
<xsl:template match="testspec">
<xsl:call-template name="call_commands"/>
</xsl:template>
<xsl:template name="call_commands">
<xsl:variable name="root" select="document($xml_input_path)/testspec"/>
<xsl:apply-templates select="$root//command" />
</xsl:template>
<xsl:template match="command[@label='TOTO_short']">
<xsl:text>Fonction TOTO :</xsl:text>
<xsl:variable name="dda" select="'b'"/>
<xsl:copy-of select="$dda"/>
</xsl:template>
<xsl:template match="command[@label='TATA_interrupt']">
Fonction TATA :
<xsl:variable name="v1_name" select="'NaN'"/>
<xsl:value-of select="$v1_name" />
</xsl:template>
</xsl:stylesheet>
实际上,我不确定为什么要将XML路径作为参数传递给此处。您可以将XSLT简化为:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:param name="basename"/>
<xsl:param name="purpose"/>
<xsl:template match="testspec">
<xsl:apply-templates select="command" />
</xsl:template>
<xsl:template match="command[@label='TOTO_short']">
<xsl:text>Fonction TOTO :</xsl:text>
<xsl:variable name="dda" select="'b'"/>
<xsl:copy-of select="$dda"/>
</xsl:template>
<xsl:template match="command[@label='TATA_interrupt']">
Fonction TATA :
<xsl:variable name="v1_name" select="'NaN'"/>
<xsl:value-of select="$v1_name" />
</xsl:template>
</xsl:stylesheet>